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.
- package/README.md +155 -0
- package/esm2020/lib/consts.mjs +170 -0
- package/esm2020/lib/i18n/en.mjs +129 -0
- package/esm2020/lib/i18n/nl.mjs +128 -0
- package/esm2020/lib/i18n/translation.service.mjs +40 -0
- package/esm2020/lib/interfaces/command.mjs +2 -0
- package/esm2020/lib/interfaces/history-item.mjs +343 -0
- package/esm2020/lib/interfaces/image-size.mjs +2 -0
- package/esm2020/lib/interfaces/tools-config.mjs +2 -0
- package/esm2020/lib/menus/buttons/crop/crop.component.mjs +22 -0
- package/esm2020/lib/menus/buttons/delete/delete.component.mjs +40 -0
- package/esm2020/lib/menus/buttons/delete-all/delete-all.component.mjs +27 -0
- package/esm2020/lib/menus/buttons/download/download.component.mjs +40 -0
- package/esm2020/lib/menus/buttons/drag/drag.component.mjs +41 -0
- package/esm2020/lib/menus/buttons/draw/draw.component.mjs +22 -0
- package/esm2020/lib/menus/buttons/filter/filter.component.mjs +22 -0
- package/esm2020/lib/menus/buttons/flip/flip.component.mjs +22 -0
- package/esm2020/lib/menus/buttons/history/history.component.mjs +41 -0
- package/esm2020/lib/menus/buttons/icon/icon.component.mjs +22 -0
- package/esm2020/lib/menus/buttons/load/load.component.mjs +23 -0
- package/esm2020/lib/menus/buttons/mask/mask.component.mjs +22 -0
- package/esm2020/lib/menus/buttons/redo/redo.component.mjs +36 -0
- package/esm2020/lib/menus/buttons/reset/reset.component.mjs +28 -0
- package/esm2020/lib/menus/buttons/rotate/rotate.component.mjs +22 -0
- package/esm2020/lib/menus/buttons/shape/shape.component.mjs +22 -0
- package/esm2020/lib/menus/buttons/text/text.component.mjs +22 -0
- package/esm2020/lib/menus/buttons/undo/undo.component.mjs +36 -0
- package/esm2020/lib/menus/buttons/zoom-in/zoom-in.component.mjs +45 -0
- package/esm2020/lib/menus/buttons/zoom-out/zoom-out.component.mjs +20 -0
- package/esm2020/lib/services/history.service.mjs +86 -0
- package/esm2020/lib/services/tools.config-manager.service.mjs +45 -0
- package/esm2020/lib/submenus/crop/crop.component.mjs +76 -0
- package/esm2020/lib/submenus/draw/draw.component.mjs +149 -0
- package/esm2020/lib/submenus/filter/filter.component.mjs +345 -0
- package/esm2020/lib/submenus/flip/flip.component.mjs +39 -0
- package/esm2020/lib/submenus/icon/icon.component.mjs +119 -0
- package/esm2020/lib/submenus/mask/mask.component.mjs +69 -0
- package/esm2020/lib/submenus/rotate/rotate.component.mjs +57 -0
- package/esm2020/lib/submenus/shape/shape.component.mjs +163 -0
- package/esm2020/lib/submenus/text/text.component.mjs +175 -0
- package/esm2020/lib/svg-definitions/svg-definitions.component.mjs +12 -0
- package/esm2020/lib/tui-image-editor.component.mjs +294 -0
- package/esm2020/lib/tui-image-editor.module.mjs +136 -0
- package/esm2020/lib/utils.mjs +173 -0
- package/esm2020/public-api.mjs +8 -0
- package/esm2020/tui-image-editor-angular2.mjs +5 -0
- package/esm2020/tui-image-editor-angular3.mjs +5 -0
- package/fesm2015/tui-image-editor-angular2.mjs +3166 -0
- package/fesm2015/tui-image-editor-angular2.mjs.map +1 -0
- package/fesm2015/tui-image-editor-angular3.mjs +3166 -0
- package/fesm2015/tui-image-editor-angular3.mjs.map +1 -0
- package/fesm2020/tui-image-editor-angular2.mjs +3126 -0
- package/fesm2020/tui-image-editor-angular2.mjs.map +1 -0
- package/fesm2020/tui-image-editor-angular3.mjs +3126 -0
- package/fesm2020/tui-image-editor-angular3.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/consts.d.ts +144 -0
- package/lib/consts.d.ts.map +1 -0
- package/lib/i18n/en.d.ts +128 -0
- package/lib/i18n/en.d.ts.map +1 -0
- package/lib/i18n/nl.d.ts +127 -0
- package/lib/i18n/nl.d.ts.map +1 -0
- package/lib/i18n/translation.service.d.ts +14 -0
- package/lib/i18n/translation.service.d.ts.map +1 -0
- package/lib/interfaces/command.d.ts +4 -0
- package/lib/interfaces/command.d.ts.map +1 -0
- package/lib/interfaces/history-item.d.ts +26 -0
- package/lib/interfaces/history-item.d.ts.map +1 -0
- package/lib/interfaces/image-size.d.ts +6 -0
- package/lib/interfaces/image-size.d.ts.map +1 -0
- package/lib/interfaces/tools-config.d.ts +14 -0
- package/lib/interfaces/tools-config.d.ts.map +1 -0
- package/lib/menus/buttons/crop/crop.component.d.ts +10 -0
- package/lib/menus/buttons/crop/crop.component.d.ts.map +1 -0
- package/lib/menus/buttons/delete/delete.component.d.ts +13 -0
- package/lib/menus/buttons/delete/delete.component.d.ts.map +1 -0
- package/lib/menus/buttons/delete-all/delete-all.component.d.ts +11 -0
- package/lib/menus/buttons/delete-all/delete-all.component.d.ts.map +1 -0
- package/lib/menus/buttons/download/download.component.d.ts +9 -0
- package/lib/menus/buttons/download/download.component.d.ts.map +1 -0
- package/lib/menus/buttons/drag/drag.component.d.ts +11 -0
- package/lib/menus/buttons/drag/drag.component.d.ts.map +1 -0
- package/lib/menus/buttons/draw/draw.component.d.ts +10 -0
- package/lib/menus/buttons/draw/draw.component.d.ts.map +1 -0
- package/lib/menus/buttons/filter/filter.component.d.ts +10 -0
- package/lib/menus/buttons/filter/filter.component.d.ts.map +1 -0
- package/lib/menus/buttons/flip/flip.component.d.ts +10 -0
- package/lib/menus/buttons/flip/flip.component.d.ts.map +1 -0
- package/lib/menus/buttons/history/history.component.d.ts +13 -0
- package/lib/menus/buttons/history/history.component.d.ts.map +1 -0
- package/lib/menus/buttons/icon/icon.component.d.ts +10 -0
- package/lib/menus/buttons/icon/icon.component.d.ts.map +1 -0
- package/lib/menus/buttons/load/load.component.d.ts +9 -0
- package/lib/menus/buttons/load/load.component.d.ts.map +1 -0
- package/lib/menus/buttons/mask/mask.component.d.ts +10 -0
- package/lib/menus/buttons/mask/mask.component.d.ts.map +1 -0
- package/lib/menus/buttons/redo/redo.component.d.ts +12 -0
- package/lib/menus/buttons/redo/redo.component.d.ts.map +1 -0
- package/lib/menus/buttons/reset/reset.component.d.ts +12 -0
- package/lib/menus/buttons/reset/reset.component.d.ts.map +1 -0
- package/lib/menus/buttons/rotate/rotate.component.d.ts +10 -0
- package/lib/menus/buttons/rotate/rotate.component.d.ts.map +1 -0
- package/lib/menus/buttons/shape/shape.component.d.ts +10 -0
- package/lib/menus/buttons/shape/shape.component.d.ts.map +1 -0
- package/lib/menus/buttons/text/text.component.d.ts +10 -0
- package/lib/menus/buttons/text/text.component.d.ts.map +1 -0
- package/lib/menus/buttons/undo/undo.component.d.ts +12 -0
- package/lib/menus/buttons/undo/undo.component.d.ts.map +1 -0
- package/lib/menus/buttons/zoom-in/zoom-in.component.d.ts +12 -0
- package/lib/menus/buttons/zoom-in/zoom-in.component.d.ts.map +1 -0
- package/lib/menus/buttons/zoom-out/zoom-out.component.d.ts +9 -0
- package/lib/menus/buttons/zoom-out/zoom-out.component.d.ts.map +1 -0
- package/lib/services/history.service.d.ts +45 -0
- package/lib/services/history.service.d.ts.map +1 -0
- package/lib/services/tools.config-manager.service.d.ts +12 -0
- package/lib/services/tools.config-manager.service.d.ts.map +1 -0
- package/lib/submenus/crop/crop.component.d.ts +23 -0
- package/lib/submenus/crop/crop.component.d.ts.map +1 -0
- package/lib/submenus/draw/draw.component.d.ts +32 -0
- package/lib/submenus/draw/draw.component.d.ts.map +1 -0
- package/lib/submenus/filter/filter.component.d.ts +70 -0
- package/lib/submenus/filter/filter.component.d.ts.map +1 -0
- package/lib/submenus/flip/flip.component.d.ts +10 -0
- package/lib/submenus/flip/flip.component.d.ts.map +1 -0
- package/lib/submenus/icon/icon.component.d.ts +24 -0
- package/lib/submenus/icon/icon.component.d.ts.map +1 -0
- package/lib/submenus/mask/mask.component.d.ts +16 -0
- package/lib/submenus/mask/mask.component.d.ts.map +1 -0
- package/lib/submenus/rotate/rotate.component.d.ts +12 -0
- package/lib/submenus/rotate/rotate.component.d.ts.map +1 -0
- package/lib/submenus/shape/shape.component.d.ts +31 -0
- package/lib/submenus/shape/shape.component.d.ts.map +1 -0
- package/lib/submenus/text/text.component.d.ts +31 -0
- package/lib/submenus/text/text.component.d.ts.map +1 -0
- package/lib/svg-definitions/svg-definitions.component.d.ts +6 -0
- package/lib/svg-definitions/svg-definitions.component.d.ts.map +1 -0
- package/lib/tui-image-editor.component.d.ts +71 -0
- package/lib/tui-image-editor.component.d.ts.map +1 -0
- package/lib/tui-image-editor.module.d.ts +48 -0
- package/lib/tui-image-editor.module.d.ts.map +1 -0
- package/lib/utils.d.ts +45 -0
- package/lib/utils.d.ts.map +1 -0
- package/package.json +43 -0
- package/public-api.d.ts +4 -0
- package/public-api.d.ts.map +1 -0
- package/src/checkboxes.scss +95 -0
- package/src/theme.scss +936 -0
- package/tui-image-editor-angular2.d.ts.map +1 -0
|
@@ -0,0 +1,345 @@
|
|
|
1
|
+
import { Component, Input } from '@angular/core';
|
|
2
|
+
import { defaultColors, filterType } from '../../consts';
|
|
3
|
+
import { HistoryItemType } from '../../interfaces/history-item';
|
|
4
|
+
import { removeFilter, rgbaToObject } from '../../utils';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
import * as i1 from "../../services/history.service";
|
|
7
|
+
import * as i2 from "@angular/forms";
|
|
8
|
+
import * as i3 from "ngx-color-picker";
|
|
9
|
+
import * as i4 from "@ngx-translate/core";
|
|
10
|
+
export class FilterComponent {
|
|
11
|
+
constructor(historyService) {
|
|
12
|
+
this.historyService = historyService;
|
|
13
|
+
this.filterBlurChecked = false;
|
|
14
|
+
this.filterBlurValue = 0.1;
|
|
15
|
+
this.filterGrayscaleChecked = false;
|
|
16
|
+
this.filterSepiaChecked = false;
|
|
17
|
+
this.filterEmbossChecked = false;
|
|
18
|
+
this.filterInvertChecked = false;
|
|
19
|
+
this.filterVintageChecked = false;
|
|
20
|
+
this.filterSharpenChecked = false;
|
|
21
|
+
this.filterWhiteRemovalChecked = false;
|
|
22
|
+
this.filterWhiteRemovalDistance = 0.5;
|
|
23
|
+
this.filterBrightnessChecked = false;
|
|
24
|
+
this.filterBrightnessValue = 0;
|
|
25
|
+
this.filterNoiseChecked = false;
|
|
26
|
+
this.filterNoiseValue = 100;
|
|
27
|
+
this.filterPixelateChecked = false;
|
|
28
|
+
this.filterPixelateValue = 15;
|
|
29
|
+
this.filterColorFilterChecked = false;
|
|
30
|
+
this.filterColorFilterThreshold = 0;
|
|
31
|
+
this.defaultFilterTintColors = defaultColors;
|
|
32
|
+
this.filterTintChecked = false;
|
|
33
|
+
this.filterTintColor = 'rgba(3, 189, 158, 0.7)';
|
|
34
|
+
this.defaultFilterMultiplyColors = defaultColors;
|
|
35
|
+
this.filterMultiplyChecked = false;
|
|
36
|
+
this.filterMultiplyColor = 'rgb(81, 92, 230)';
|
|
37
|
+
this.defaultFilterBlendColors = defaultColors;
|
|
38
|
+
this.filterBlendChecked = false;
|
|
39
|
+
this.filterBlendColor = 'rgba(255, 187, 59, 1)';
|
|
40
|
+
}
|
|
41
|
+
ngOnInit() {
|
|
42
|
+
this.historyServiceSubscription = this.historyService.onChangeEmitter.subscribe((items) => items != null && items.length != 0
|
|
43
|
+
? this.rebindFields(items)
|
|
44
|
+
: this.rebindFields(this.historyService.items));
|
|
45
|
+
}
|
|
46
|
+
ngOnDestroy() {
|
|
47
|
+
this.historyServiceSubscription?.unsubscribe();
|
|
48
|
+
}
|
|
49
|
+
rebindFields(items) {
|
|
50
|
+
console.debug(items);
|
|
51
|
+
if (this.imageEditor != null) {
|
|
52
|
+
this.filterBlurChecked = this.imageEditor.hasFilter('blur');
|
|
53
|
+
this.filterBrightnessChecked = this.imageEditor.hasFilter('brightness');
|
|
54
|
+
if (this.filterBrightnessChecked) {
|
|
55
|
+
this.filterBrightnessValue = this.getAppliedFilterArgument(items, filterType.BRIGHTNESS, 0);
|
|
56
|
+
}
|
|
57
|
+
this.filterColorFilterChecked =
|
|
58
|
+
this.imageEditor.hasFilter('removeColor') &&
|
|
59
|
+
this.hasAppliedFilter(items, filterType.REMOVE_COLOR);
|
|
60
|
+
if (this.filterColorFilterChecked) {
|
|
61
|
+
this.filterColorFilterThreshold = this.getAppliedFilterArgument(items, filterType.REMOVE_COLOR, 0);
|
|
62
|
+
}
|
|
63
|
+
this.filterEmbossChecked = this.imageEditor.hasFilter('emboss');
|
|
64
|
+
this.filterGrayscaleChecked = this.imageEditor.hasFilter('grayscale');
|
|
65
|
+
this.filterInvertChecked = this.imageEditor.hasFilter('invert');
|
|
66
|
+
this.filterNoiseChecked = this.imageEditor.hasFilter('noise');
|
|
67
|
+
if (this.filterNoiseChecked) {
|
|
68
|
+
this.filterNoiseValue = this.getAppliedFilterArgument(items, filterType.NOISE, 0);
|
|
69
|
+
}
|
|
70
|
+
this.filterPixelateChecked = this.imageEditor.hasFilter('pixelate');
|
|
71
|
+
if (this.filterPixelateChecked) {
|
|
72
|
+
this.filterPixelateValue = this.getAppliedFilterArgument(items, filterType.PIXELATE, 0);
|
|
73
|
+
}
|
|
74
|
+
this.filterSepiaChecked = this.imageEditor.hasFilter('sepia');
|
|
75
|
+
this.filterSharpenChecked = this.imageEditor.hasFilter('sharpen');
|
|
76
|
+
this.filterVintageChecked = this.imageEditor.hasFilter('vintage');
|
|
77
|
+
this.filterWhiteRemovalChecked =
|
|
78
|
+
this.imageEditor.hasFilter('removeColor') &&
|
|
79
|
+
this.hasAppliedFilter(items, filterType.REMOVE_WHITE);
|
|
80
|
+
if (this.filterWhiteRemovalChecked) {
|
|
81
|
+
this.filterWhiteRemovalDistance = this.getAppliedFilterArgument(items, filterType.REMOVE_WHITE, 0);
|
|
82
|
+
}
|
|
83
|
+
this.filterMultiplyChecked =
|
|
84
|
+
this.imageEditor.hasFilter('blendColor') &&
|
|
85
|
+
this.hasAppliedFilter(items, filterType.MULTIPLY);
|
|
86
|
+
if (this.filterMultiplyChecked) {
|
|
87
|
+
this.filterMultiplyColor = this.getAppliedFilterArgument(items, filterType.MULTIPLY, 0);
|
|
88
|
+
}
|
|
89
|
+
this.filterTintChecked =
|
|
90
|
+
this.imageEditor.hasFilter('blendColor') &&
|
|
91
|
+
this.hasAppliedFilter(items, filterType.TINT);
|
|
92
|
+
if (this.filterTintChecked) {
|
|
93
|
+
this.filterTintColor = this.getAppliedFilterArgument(items, filterType.TINT, 0);
|
|
94
|
+
}
|
|
95
|
+
this.filterBlendChecked =
|
|
96
|
+
this.imageEditor.hasFilter('blendColor') &&
|
|
97
|
+
this.hasAppliedFilter(items, filterType.BLEND);
|
|
98
|
+
if (this.filterBlendChecked) {
|
|
99
|
+
this.filterBlendColor = this.getAppliedFilterArgument(items, filterType.BLEND, 0);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
getAppliedFilterArgument(items, type, index) {
|
|
104
|
+
let validItems = items.filter((f) => f.filterType === type && f.type === HistoryItemType.ApplyFilter);
|
|
105
|
+
return validItems[validItems.length - 1].args[index];
|
|
106
|
+
}
|
|
107
|
+
hasAppliedFilter(historyItems, type) {
|
|
108
|
+
let hasFilter = false;
|
|
109
|
+
for (let i = 0; i < historyItems.length; i++) {
|
|
110
|
+
let item = historyItems[i];
|
|
111
|
+
if (item.type === HistoryItemType.ApplyFilter &&
|
|
112
|
+
item.filterType === type) {
|
|
113
|
+
hasFilter = true;
|
|
114
|
+
}
|
|
115
|
+
else if (hasFilter == true &&
|
|
116
|
+
[filterType.TINT, filterType.BLEND, filterType.MULTIPLY].some((t) => t === type) &&
|
|
117
|
+
item.type === HistoryItemType.RemoveFilter &&
|
|
118
|
+
item.filterType === filterType.BLEND_OR_TINT_OR_MULTIPLY) {
|
|
119
|
+
hasFilter = false;
|
|
120
|
+
}
|
|
121
|
+
else if (hasFilter == true &&
|
|
122
|
+
[filterType.REMOVE_COLOR, filterType.REMOVE_WHITE].some((t) => t === type) &&
|
|
123
|
+
item.type === HistoryItemType.RemoveFilter &&
|
|
124
|
+
item.filterType === filterType.REMOVE_COLOR_OR_WHITE) {
|
|
125
|
+
hasFilter = false;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return hasFilter;
|
|
129
|
+
}
|
|
130
|
+
filterWhiteRemovalCheckedChanged(newValue) {
|
|
131
|
+
this.filterApply('white-removal');
|
|
132
|
+
}
|
|
133
|
+
filterWhiteRemovalDistanceChanged(newValue, isSilent) {
|
|
134
|
+
this.filterApply('white-removal', isSilent);
|
|
135
|
+
}
|
|
136
|
+
filterBrightnessCheckedChanged(newValue) {
|
|
137
|
+
this.filterApply('brightness');
|
|
138
|
+
}
|
|
139
|
+
filterBrightnessValueChanged(newValue, isSilent) {
|
|
140
|
+
this.filterApply('brightness', isSilent);
|
|
141
|
+
}
|
|
142
|
+
filterNoiseCheckedChanged(newValue) {
|
|
143
|
+
this.filterApply('noise');
|
|
144
|
+
}
|
|
145
|
+
filterNoiseValueChanged(newValue, isSilent) {
|
|
146
|
+
this.filterApply('noise', isSilent);
|
|
147
|
+
}
|
|
148
|
+
filterPixelateCheckedChanged(newValue) {
|
|
149
|
+
this.filterApply('pixelate');
|
|
150
|
+
}
|
|
151
|
+
filterPixelateValueChanged(newValue, isSilent) {
|
|
152
|
+
this.filterApply('pixelate', isSilent);
|
|
153
|
+
}
|
|
154
|
+
filterColorFilterCheckedChanged(newValue) {
|
|
155
|
+
this.filterApply('removeColor');
|
|
156
|
+
}
|
|
157
|
+
filterColorFilterThresholdChanged(newValue, isSilent) {
|
|
158
|
+
this.filterApply('removeColor', isSilent);
|
|
159
|
+
}
|
|
160
|
+
filterTintColorChanged(newColor) {
|
|
161
|
+
this.filterApply('tint');
|
|
162
|
+
}
|
|
163
|
+
filterTintCheckedChanged(newValue) {
|
|
164
|
+
this.filterApply('tint');
|
|
165
|
+
if (this.filterTintChecked) {
|
|
166
|
+
this.filterMultiplyChecked = false;
|
|
167
|
+
this.filterBlendChecked = false;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
filterMultiplyColorChanged(newColor) {
|
|
171
|
+
this.filterApply('multiply');
|
|
172
|
+
}
|
|
173
|
+
filterMultiplyCheckedChanged(newValue) {
|
|
174
|
+
this.filterApply('multiply');
|
|
175
|
+
if (this.filterMultiplyChecked) {
|
|
176
|
+
this.filterTintChecked = false;
|
|
177
|
+
this.filterBlendChecked = false;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
filterBlendColorChanged(newColor) {
|
|
181
|
+
this.filterApply('blend');
|
|
182
|
+
}
|
|
183
|
+
filterBlendCheckedChanged(newValue) {
|
|
184
|
+
this.filterApply('blend');
|
|
185
|
+
if (this.filterBlendChecked) {
|
|
186
|
+
this.filterMultiplyChecked = false;
|
|
187
|
+
this.filterTintChecked = false;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
filterBlurCheckedChanged(newValue) {
|
|
191
|
+
this.filterApply('blur');
|
|
192
|
+
}
|
|
193
|
+
filterGrayscaleCheckedChanged(newValue) {
|
|
194
|
+
this.filterApply('grayscale');
|
|
195
|
+
}
|
|
196
|
+
filterSepiaCheckedChanged(newValue) {
|
|
197
|
+
this.filterApply('sepia');
|
|
198
|
+
}
|
|
199
|
+
filterEmbossCheckedChanged(newValue) {
|
|
200
|
+
this.filterApply('emboss');
|
|
201
|
+
}
|
|
202
|
+
filterInvertCheckedChanged(newValue) {
|
|
203
|
+
this.filterApply('invert');
|
|
204
|
+
}
|
|
205
|
+
filterVintageCheckedChanged(newValue) {
|
|
206
|
+
this.filterApply('vintage');
|
|
207
|
+
}
|
|
208
|
+
filterSharpenCheckedChanged(newValue) {
|
|
209
|
+
this.filterApply('sharpen');
|
|
210
|
+
}
|
|
211
|
+
filterApply(type, isSilent = false) {
|
|
212
|
+
switch (type) {
|
|
213
|
+
case 'white-removal':
|
|
214
|
+
this.filterApplyConfirmed(this.filterWhiteRemovalChecked, 'removeColor', {
|
|
215
|
+
color: '#FFFFFF',
|
|
216
|
+
useAlpha: false,
|
|
217
|
+
distance: this.filterWhiteRemovalDistance,
|
|
218
|
+
}, isSilent);
|
|
219
|
+
break;
|
|
220
|
+
case 'brightness':
|
|
221
|
+
this.filterApplyConfirmed(this.filterBrightnessChecked, 'brightness', {
|
|
222
|
+
brightness: this.filterBrightnessValue,
|
|
223
|
+
}, isSilent);
|
|
224
|
+
break;
|
|
225
|
+
case 'noise':
|
|
226
|
+
this.filterApplyConfirmed(this.filterNoiseChecked, 'noise', {
|
|
227
|
+
noise: this.filterNoiseValue,
|
|
228
|
+
}, isSilent);
|
|
229
|
+
break;
|
|
230
|
+
case 'pixelate':
|
|
231
|
+
this.filterApplyConfirmed(this.filterPixelateChecked, 'pixelate', {
|
|
232
|
+
blocksize: this.filterPixelateValue,
|
|
233
|
+
}, isSilent);
|
|
234
|
+
break;
|
|
235
|
+
case 'removeColor':
|
|
236
|
+
this.filterApplyConfirmed(this.filterColorFilterChecked, 'removeColor', {
|
|
237
|
+
color: '#FFFFFF',
|
|
238
|
+
distance: this.filterColorFilterThreshold,
|
|
239
|
+
}, isSilent);
|
|
240
|
+
break;
|
|
241
|
+
case 'blur':
|
|
242
|
+
this.filterApplyConfirmed(this.filterBlurChecked, 'blur', {
|
|
243
|
+
blur: this.filterBlurValue,
|
|
244
|
+
}, isSilent);
|
|
245
|
+
break;
|
|
246
|
+
case 'blend':
|
|
247
|
+
this.filterApplyConfirmed(this.filterBlendChecked, 'blendColor', {
|
|
248
|
+
mode: 'add',
|
|
249
|
+
color: this.filterBlendColor,
|
|
250
|
+
}, isSilent);
|
|
251
|
+
break;
|
|
252
|
+
case 'multiply':
|
|
253
|
+
this.filterApplyConfirmed(this.filterMultiplyChecked, 'blendColor', {
|
|
254
|
+
mode: 'multiply',
|
|
255
|
+
color: this.filterMultiplyColor,
|
|
256
|
+
}, isSilent);
|
|
257
|
+
break;
|
|
258
|
+
case 'tint':
|
|
259
|
+
let rgbTint = rgbaToObject(this.filterTintColor);
|
|
260
|
+
this.filterApplyConfirmed(this.filterTintChecked, 'blendColor', {
|
|
261
|
+
mode: 'tint',
|
|
262
|
+
color: rgbTint.hexString,
|
|
263
|
+
alpha: rgbTint.alpha,
|
|
264
|
+
}, isSilent);
|
|
265
|
+
break;
|
|
266
|
+
case 'grayscale':
|
|
267
|
+
this.filterApplyConfirmed(this.filterGrayscaleChecked, type, {}, isSilent);
|
|
268
|
+
break;
|
|
269
|
+
case 'sepia':
|
|
270
|
+
this.filterApplyConfirmed(this.filterSepiaChecked, type, {}, isSilent);
|
|
271
|
+
break;
|
|
272
|
+
case 'emboss':
|
|
273
|
+
this.filterApplyConfirmed(this.filterEmbossChecked, type, {}, isSilent);
|
|
274
|
+
break;
|
|
275
|
+
case 'invert':
|
|
276
|
+
this.filterApplyConfirmed(this.filterInvertChecked, type, {}, isSilent);
|
|
277
|
+
break;
|
|
278
|
+
case 'vintage':
|
|
279
|
+
this.filterApplyConfirmed(this.filterVintageChecked, type, {}, isSilent);
|
|
280
|
+
break;
|
|
281
|
+
case 'sharpen':
|
|
282
|
+
this.filterApplyConfirmed(this.filterSharpenChecked, type, {}, isSilent);
|
|
283
|
+
break;
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
async filterApplyConfirmed(applying, type, options, isSilent = false) {
|
|
287
|
+
let functionToExecute = async () => {
|
|
288
|
+
if (applying) {
|
|
289
|
+
if (type === 'blendColor' && this.imageEditor.hasFilter('blendColor')) {
|
|
290
|
+
switch (options.mode) {
|
|
291
|
+
case 'add':
|
|
292
|
+
this.filterTintChecked = false;
|
|
293
|
+
this.filterMultiplyChecked = false;
|
|
294
|
+
break;
|
|
295
|
+
case 'multiply':
|
|
296
|
+
this.filterTintChecked = false;
|
|
297
|
+
this.filterBlendChecked = false;
|
|
298
|
+
break;
|
|
299
|
+
case 'tint':
|
|
300
|
+
this.filterBlendChecked = false;
|
|
301
|
+
this.filterMultiplyChecked = false;
|
|
302
|
+
break;
|
|
303
|
+
}
|
|
304
|
+
await removeFilter(this.imageEditor, type, isSilent);
|
|
305
|
+
}
|
|
306
|
+
else if (type === 'removeColor' &&
|
|
307
|
+
this.imageEditor.hasFilter('removeColor')) {
|
|
308
|
+
if (options.useAlpha != null) {
|
|
309
|
+
this.filterColorFilterChecked = false;
|
|
310
|
+
}
|
|
311
|
+
else {
|
|
312
|
+
this.filterWhiteRemovalChecked = false;
|
|
313
|
+
}
|
|
314
|
+
await removeFilter(this.imageEditor, type, isSilent);
|
|
315
|
+
}
|
|
316
|
+
await this.imageEditor.applyFilter(type, options, isSilent);
|
|
317
|
+
}
|
|
318
|
+
else if (this.imageEditor.hasFilter(type)) {
|
|
319
|
+
await removeFilter(this.imageEditor, type, isSilent);
|
|
320
|
+
if (type == 'blendColor') {
|
|
321
|
+
this.filterTintChecked = false;
|
|
322
|
+
this.filterMultiplyChecked = false;
|
|
323
|
+
this.filterBlendChecked = false;
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
};
|
|
327
|
+
if (isSilent) {
|
|
328
|
+
await functionToExecute();
|
|
329
|
+
}
|
|
330
|
+
else {
|
|
331
|
+
setTimeout(async () => {
|
|
332
|
+
await functionToExecute();
|
|
333
|
+
});
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
FilterComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.0", ngImport: i0, type: FilterComponent, deps: [{ token: i1.HistoryService }], target: i0.ɵɵFactoryTarget.Component });
|
|
338
|
+
FilterComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.0", type: FilterComponent, selector: "tui-image-editor-submenus-filter", inputs: { imageEditor: "imageEditor" }, ngImport: i0, template: "<div\r\n class=\"tui-image-editor-menu-filter tui-image-editor-d-flex tui-image-editor-justify-content-center\"\r\n>\r\n <div\r\n class=\"tui-image-editor-submenu-item 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 class=\"tui-image-editor-submenu-align\">\r\n <div\r\n class=\"tui-image-editor-checkbox-wrap fixed-width tui-image-editor-d-flex tui-image-editor-flex-row tui-image-editor-flex-wrap tui-image-editor-justify-content-center\"\r\n >\r\n <div class=\"tui-image-editor-checkbox tui-image-editor-align-self-center\">\r\n <label\r\n class=\"tui-image-editor-d-flex tui-image-editor-flex-row tui-image-editor-align-items-center tui-image-editor-flex-nowrap\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n class=\"tie-grayscale\"\r\n [(ngModel)]=\"filterGrayscaleChecked\"\r\n (ngModelChange)=\"filterGrayscaleCheckedChanged($event)\"\r\n />\r\n <span>{{\r\n \"tui-image-editor-angular-submenus-filter-grayscale\" | translate\r\n }}</span>\r\n </label>\r\n </div>\r\n <div class=\"tui-image-editor-checkbox tui-image-editor-align-self-center\">\r\n <label\r\n class=\"tui-image-editor-d-flex tui-image-editor-flex-row tui-image-editor-align-items-center tui-image-editor-flex-nowrap\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n class=\"tie-invert\"\r\n [(ngModel)]=\"filterInvertChecked\"\r\n (ngModelChange)=\"filterInvertCheckedChanged($event)\"\r\n />\r\n <span>{{\r\n \"tui-image-editor-angular-submenus-filter-invert\" | translate\r\n }}</span>\r\n </label>\r\n </div>\r\n <div class=\"tui-image-editor-checkbox tui-image-editor-align-self-center\">\r\n <label\r\n class=\"tui-image-editor-d-flex tui-image-editor-flex-row tui-image-editor-align-items-center tui-image-editor-flex-nowrap\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n class=\"tie-sepia\"\r\n [(ngModel)]=\"filterSepiaChecked\"\r\n (ngModelChange)=\"filterSepiaCheckedChanged($event)\"\r\n />\r\n <span>{{\r\n \"tui-image-editor-angular-submenus-filter-sepia\" | translate\r\n }}</span>\r\n </label>\r\n </div>\r\n <div class=\"tui-image-editor-checkbox tui-image-editor-align-self-center\">\r\n <label\r\n class=\"tui-image-editor-d-flex tui-image-editor-flex-row tui-image-editor-align-items-center tui-image-editor-flex-nowrap\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n class=\"tie-vintage\"\r\n [(ngModel)]=\"filterVintageChecked\"\r\n (ngModelChange)=\"filterVintageCheckedChanged($event)\"\r\n />\r\n <span>{{\r\n \"tui-image-editor-angular-submenus-filter-sepia2\" | translate\r\n }}</span>\r\n </label>\r\n </div>\r\n <div class=\"tui-image-editor-checkbox tui-image-editor-align-self-center\">\r\n <label\r\n class=\"tui-image-editor-d-flex tui-image-editor-flex-row tui-image-editor-align-items-center tui-image-editor-flex-nowrap\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n class=\"tie-blur\"\r\n [(ngModel)]=\"filterBlurChecked\"\r\n (ngModelChange)=\"filterBlurCheckedChanged($event)\"\r\n />\r\n <span>{{\r\n \"tui-image-editor-angular-submenus-filter-blur\" | translate\r\n }}</span>\r\n </label>\r\n </div>\r\n <div class=\"tui-image-editor-checkbox tui-image-editor-align-self-center\">\r\n <label\r\n class=\"tui-image-editor-d-flex tui-image-editor-flex-row tui-image-editor-align-items-center tui-image-editor-flex-nowrap\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n class=\"tie-sharpen\"\r\n [(ngModel)]=\"filterSharpenChecked\"\r\n (ngModelChange)=\"filterSharpenCheckedChanged($event)\"\r\n />\r\n <span>{{\r\n \"tui-image-editor-angular-submenus-filter-sharpen\" | translate\r\n }}</span>\r\n </label>\r\n </div>\r\n <div class=\"tui-image-editor-checkbox tui-image-editor-align-self-center\">\r\n <label\r\n class=\"tui-image-editor-d-flex tui-image-editor-flex-row tui-image-editor-align-items-center tui-image-editor-flex-nowrap\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n class=\"tie-emboss\"\r\n [(ngModel)]=\"filterEmbossChecked\"\r\n (ngModelChange)=\"filterEmbossCheckedChanged($event)\"\r\n />\r\n <span>{{\r\n \"tui-image-editor-angular-submenus-filter-emboss\" | translate\r\n }}</span>\r\n </label>\r\n </div>\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=\"tui-image-editor-submenu-align\">\r\n <div\r\n class=\"tui-image-editor-checkbox-group tui-image-editor-disabled\"\r\n style=\"margin-bottom: 7px\"\r\n >\r\n <div class=\"tui-image-editor-checkbox-wrap\">\r\n <div class=\"tui-image-editor-checkbox\">\r\n <label\r\n class=\"tui-image-editor-d-flex tui-image-editor-flex-row tui-image-editor-align-items-center tui-image-editor-flex-nowrap\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n class=\"tie-remove-white\"\r\n [(ngModel)]=\"filterWhiteRemovalChecked\"\r\n (ngModelChange)=\"filterWhiteRemovalCheckedChanged($event)\"\r\n />\r\n <span>{{\r\n \"tui-image-editor-angular-submenus-filter-removeWhite\"\r\n | translate\r\n }}</span>\r\n </label>\r\n </div>\r\n </div>\r\n <div\r\n class=\"tui-image-editor-newline tui-image-editor-range-wrap short tui-image-editor-d-flex tui-image-editor-flex-row tui-image-editor-flex-nowrap tui-image-editor-align-items-center\"\r\n >\r\n <label>{{\r\n \"tui-image-editor-angular-submenus-filter-removeWhite-distance\"\r\n | translate\r\n }}</label>\r\n <input\r\n type=\"range\"\r\n [(ngModel)]=\"filterWhiteRemovalDistance\"\r\n (ngModelChange)=\"filterWhiteRemovalDistanceChanged($event, true)\"\r\n (change)=\"filterWhiteRemovalDistanceChanged($event, false)\"\r\n min=\"0\"\r\n max=\"1\"\r\n step=\"0.001\"\r\n [disabled]=\"filterWhiteRemovalChecked == false\"\r\n />\r\n </div>\r\n </div>\r\n <div class=\"tui-image-editor-checkbox-group tui-image-editor-disabled\">\r\n <div class=\"tui-image-editor-checkbox\">\r\n <label\r\n class=\"tui-image-editor-d-flex tui-image-editor-flex-row tui-image-editor-align-items-center tui-image-editor-flex-nowrap\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n class=\"tie-brightness\"\r\n [(ngModel)]=\"filterBrightnessChecked\"\r\n (ngModelChange)=\"filterBrightnessCheckedChanged($event)\"\r\n />\r\n <span>{{\r\n \"tui-image-editor-angular-submenus-filter-brightness\" | translate\r\n }}</span>\r\n </label>\r\n </div>\r\n <div class=\"tui-image-editor-range-wrap short tui-image-editor-d-flex tui-image-editor-flex-row align-items-center tui-image-editor-my-2\">\r\n <input\r\n type=\"range\"\r\n [(ngModel)]=\"filterBrightnessValue\"\r\n (ngModelChange)=\"filterBrightnessValueChanged($event, true)\"\r\n (change)=\"filterBrightnessValueChanged($event, false)\"\r\n min=\"-1\"\r\n max=\"1\"\r\n step=\"0.03\"\r\n [disabled]=\"filterBrightnessChecked == false\"\r\n />\r\n </div>\r\n </div>\r\n <div class=\"tui-image-editor-checkbox-group tui-image-editor-disabled\">\r\n <div class=\"tui-image-editor-checkbox\">\r\n <label\r\n class=\"tui-image-editor-d-flex tui-image-editor-flex-row tui-image-editor-align-items-center tui-image-editor-flex-nowrap\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n class=\"tie-noise\"\r\n [(ngModel)]=\"filterNoiseChecked\"\r\n (ngModelChange)=\"filterNoiseCheckedChanged($event)\"\r\n />\r\n <span>{{\r\n \"tui-image-editor-angular-submenus-filter-noise\" | translate\r\n }}</span>\r\n </label>\r\n </div>\r\n <div class=\"tui-image-editor-range-wrap short tui-image-editor-d-flex tui-image-editor-flex-row align-items-center tui-image-editor-my-2\">\r\n <input\r\n type=\"range\"\r\n [(ngModel)]=\"filterNoiseValue\"\r\n (ngModelChange)=\"filterNoiseValueChanged($event, true)\"\r\n (change)=\"filterNoiseValueChanged($event, false)\"\r\n min=\"0\"\r\n max=\"1000\"\r\n step=\"10\"\r\n [disabled]=\"filterNoiseChecked == false\"\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"tui-image-editor-partition only-left-right\">\r\n <div></div>\r\n </div>\r\n <div class=\"tui-image-editor-submenu-align\">\r\n <div class=\"tui-image-editor-checkbox-group tui-image-editor-disabled\">\r\n <div class=\"tui-image-editor-checkbox\">\r\n <label\r\n class=\"tui-image-editor-d-flex tui-image-editor-flex-row tui-image-editor-align-items-center tui-image-editor-flex-nowrap\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n class=\"tie-pixelate\"\r\n [(ngModel)]=\"filterPixelateChecked\"\r\n (ngModelChange)=\"filterPixelateCheckedChanged($event)\"\r\n />\r\n <span>{{\r\n \"tui-image-editor-angular-submenus-filter-pixelate\" | translate\r\n }}</span>\r\n </label>\r\n </div>\r\n <div class=\"tui-image-editor-range-wrap short tui-image-editor-d-flex tui-image-editor-flex-row align-items-center tui-image-editor-my-2\">\r\n <input\r\n type=\"range\"\r\n [(ngModel)]=\"filterPixelateValue\"\r\n (ngModelChange)=\"filterPixelateValueChanged($event, true)\"\r\n (change)=\"filterPixelateValueChanged($event, false)\"\r\n min=\"2\"\r\n max=\"20\"\r\n step=\"1\"\r\n [disabled]=\"filterPixelateChecked == false\"\r\n />\r\n </div>\r\n </div>\r\n <div class=\"tui-image-editor-checkbox-group tui-image-editor-disabled\">\r\n <div class=\"tui-image-editor-newline tui-image-editor-checkbox-wrap\">\r\n <div class=\"tui-image-editor-checkbox\">\r\n <label\r\n class=\"tui-image-editor-d-flex tui-image-editor-flex-row tui-image-editor-align-items-center tui-image-editor-flex-nowrap\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n class=\"tie-color-filter\"\r\n [(ngModel)]=\"filterColorFilterChecked\"\r\n (ngModelChange)=\"filterColorFilterCheckedChanged($event)\"\r\n />\r\n <span>{{\r\n \"tui-image-editor-angular-submenus-filter-colorFilter\"\r\n | translate\r\n }}</span>\r\n </label>\r\n </div>\r\n </div>\r\n <div class=\"tui-image-editor-newline tui-image-editor-range-wrap short\">\r\n <label>{{\r\n \"tui-image-editor-angular-submenus-filter-colorFilter-threshold\"\r\n | translate\r\n }}</label>\r\n <div class=\"tie-colorfilter-threshold-range tui-image-editor-range tui-image-editor-d-flex tui-image-editor-flex-row align-items-center tui-image-editor-my-2\">\r\n <input\r\n type=\"range\"\r\n [(ngModel)]=\"filterColorFilterThreshold\"\r\n (ngModelChange)=\"filterColorFilterThresholdChanged($event, true)\"\r\n (change)=\"filterColorFilterThresholdChanged($event, false)\"\r\n min=\"0\"\r\n max=\"1\"\r\n step=\"0.02\"\r\n [disabled]=\"filterColorFilterChecked == false\"\r\n />\r\n </div>\r\n </div>\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=\"tui-image-editor-d-flex tui-image-editor-flex-row tui-image-editor-align-items-center\"\r\n >\r\n <div class=\"filter-color-item\">\r\n <div\r\n [class]=\"\r\n 'tie-filter-tint-color tui-image-editor-button tui-image-editor-button-color-picker tui-image-editor-d-flex tui-image-editor-flex-column tui-image-editor-align-items-center ' +\r\n (filterTintChecked ? 'active' : '')\r\n \"\r\n [title]=\"'tui-image-editor-angular-submenus-filter-tint' | translate\"\r\n >\r\n <input\r\n readonly\r\n class=\"tie-filter-tint-color-picker tui-image-editor-mb-2\"\r\n [(colorPicker)]=\"filterTintColor\"\r\n [style.background]=\"filterTintColor\"\r\n [cpOutputFormat]=\"'rgba'\"\r\n [cpPresetColors]=\"defaultFilterTintColors\"\r\n (colorPickerChange)=\"filterTintColorChanged($event)\"\r\n [cpUseRootViewContainer]=\"true\"\r\n />\r\n <label\r\n class=\"tui-image-editor-d-flex tui-image-editor-flex-row tui-image-editor-align-items-center tui-image-editor-flex-nowrap\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n class=\"tie-tint\"\r\n [(ngModel)]=\"filterTintChecked\"\r\n (ngModelChange)=\"filterTintCheckedChanged($event)\"\r\n />\r\n <span>{{\r\n \"tui-image-editor-angular-submenus-filter-tint\" | translate\r\n }}</span>\r\n </label>\r\n </div>\r\n </div>\r\n <div class=\"filter-color-item\">\r\n <div\r\n [class]=\"\r\n 'tie-filter-multiply-color tui-image-editor-button tui-image-editor-button-color-picker tui-image-editor-d-flex tui-image-editor-flex-column tui-image-editor-align-items-center ' +\r\n (filterMultiplyChecked ? 'active' : '')\r\n \"\r\n [title]=\"\r\n 'tui-image-editor-angular-submenus-filter-multiply' | translate\r\n \"\r\n >\r\n <input\r\n readonly\r\n class=\"tie-filter-multiply-color-picker tui-image-editor-mb-2\"\r\n [(colorPicker)]=\"filterMultiplyColor\"\r\n [style.background]=\"filterMultiplyColor\"\r\n [cpOutputFormat]=\"'hex'\"\r\n [cpPresetColors]=\"defaultFilterMultiplyColors\"\r\n (colorPickerChange)=\"filterMultiplyColorChanged($event)\"\r\n [cpUseRootViewContainer]=\"true\"\r\n />\r\n <label\r\n class=\"tui-image-editor-d-flex tui-image-editor-flex-row tui-image-editor-align-items-center tui-image-editor-flex-nowrap\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n class=\"tie-multiply\"\r\n [(ngModel)]=\"filterMultiplyChecked\"\r\n (ngModelChange)=\"filterMultiplyCheckedChanged($event)\"\r\n />\r\n <span>{{\r\n \"tui-image-editor-angular-submenus-filter-multiply\" | translate\r\n }}</span>\r\n </label>\r\n </div>\r\n </div>\r\n <div class=\"filter-color-item\">\r\n <div\r\n [class]=\"\r\n 'tie-filter-blend-color tui-image-editor-button tui-image-editor-button-color-picker tui-image-editor-d-flex tui-image-editor-flex-column tui-image-editor-align-items-center ' +\r\n (filterBlendChecked ? 'active' : '')\r\n \"\r\n [title]=\"'tui-image-editor-angular-submenus-filter-blend' | translate\"\r\n >\r\n <input\r\n readonly\r\n class=\"tie-filter-blend-color-picker tui-image-editor-mb-2\"\r\n [(colorPicker)]=\"filterBlendColor\"\r\n [style.background]=\"filterBlendColor\"\r\n [cpOutputFormat]=\"'rgba'\"\r\n [cpPresetColors]=\"defaultFilterBlendColors\"\r\n (colorPickerChange)=\"filterBlendColorChanged($event)\"\r\n [cpUseRootViewContainer]=\"true\"\r\n />\r\n <label\r\n class=\"tui-image-editor-d-flex tui-image-editor-flex-row tui-image-editor-align-items-center tui-image-editor-flex-nowrap\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n class=\"tie-blend\"\r\n [(ngModel)]=\"filterBlendChecked\"\r\n (ngModelChange)=\"filterBlendCheckedChanged($event)\"\r\n />\r\n <span>{{\r\n \"tui-image-editor-angular-submenus-filter-blend\" | translate\r\n }}</span>\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [""], dependencies: [{ kind: "directive", type: i2.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: i2.RangeValueAccessor, selector: "input[type=range][formControlName],input[type=range][formControl],input[type=range][ngModel]" }, { kind: "directive", type: i2.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i3.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: i4.TranslatePipe, name: "translate" }] });
|
|
339
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.0", ngImport: i0, type: FilterComponent, decorators: [{
|
|
340
|
+
type: Component,
|
|
341
|
+
args: [{ selector: 'tui-image-editor-submenus-filter', template: "<div\r\n class=\"tui-image-editor-menu-filter tui-image-editor-d-flex tui-image-editor-justify-content-center\"\r\n>\r\n <div\r\n class=\"tui-image-editor-submenu-item 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 class=\"tui-image-editor-submenu-align\">\r\n <div\r\n class=\"tui-image-editor-checkbox-wrap fixed-width tui-image-editor-d-flex tui-image-editor-flex-row tui-image-editor-flex-wrap tui-image-editor-justify-content-center\"\r\n >\r\n <div class=\"tui-image-editor-checkbox tui-image-editor-align-self-center\">\r\n <label\r\n class=\"tui-image-editor-d-flex tui-image-editor-flex-row tui-image-editor-align-items-center tui-image-editor-flex-nowrap\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n class=\"tie-grayscale\"\r\n [(ngModel)]=\"filterGrayscaleChecked\"\r\n (ngModelChange)=\"filterGrayscaleCheckedChanged($event)\"\r\n />\r\n <span>{{\r\n \"tui-image-editor-angular-submenus-filter-grayscale\" | translate\r\n }}</span>\r\n </label>\r\n </div>\r\n <div class=\"tui-image-editor-checkbox tui-image-editor-align-self-center\">\r\n <label\r\n class=\"tui-image-editor-d-flex tui-image-editor-flex-row tui-image-editor-align-items-center tui-image-editor-flex-nowrap\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n class=\"tie-invert\"\r\n [(ngModel)]=\"filterInvertChecked\"\r\n (ngModelChange)=\"filterInvertCheckedChanged($event)\"\r\n />\r\n <span>{{\r\n \"tui-image-editor-angular-submenus-filter-invert\" | translate\r\n }}</span>\r\n </label>\r\n </div>\r\n <div class=\"tui-image-editor-checkbox tui-image-editor-align-self-center\">\r\n <label\r\n class=\"tui-image-editor-d-flex tui-image-editor-flex-row tui-image-editor-align-items-center tui-image-editor-flex-nowrap\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n class=\"tie-sepia\"\r\n [(ngModel)]=\"filterSepiaChecked\"\r\n (ngModelChange)=\"filterSepiaCheckedChanged($event)\"\r\n />\r\n <span>{{\r\n \"tui-image-editor-angular-submenus-filter-sepia\" | translate\r\n }}</span>\r\n </label>\r\n </div>\r\n <div class=\"tui-image-editor-checkbox tui-image-editor-align-self-center\">\r\n <label\r\n class=\"tui-image-editor-d-flex tui-image-editor-flex-row tui-image-editor-align-items-center tui-image-editor-flex-nowrap\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n class=\"tie-vintage\"\r\n [(ngModel)]=\"filterVintageChecked\"\r\n (ngModelChange)=\"filterVintageCheckedChanged($event)\"\r\n />\r\n <span>{{\r\n \"tui-image-editor-angular-submenus-filter-sepia2\" | translate\r\n }}</span>\r\n </label>\r\n </div>\r\n <div class=\"tui-image-editor-checkbox tui-image-editor-align-self-center\">\r\n <label\r\n class=\"tui-image-editor-d-flex tui-image-editor-flex-row tui-image-editor-align-items-center tui-image-editor-flex-nowrap\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n class=\"tie-blur\"\r\n [(ngModel)]=\"filterBlurChecked\"\r\n (ngModelChange)=\"filterBlurCheckedChanged($event)\"\r\n />\r\n <span>{{\r\n \"tui-image-editor-angular-submenus-filter-blur\" | translate\r\n }}</span>\r\n </label>\r\n </div>\r\n <div class=\"tui-image-editor-checkbox tui-image-editor-align-self-center\">\r\n <label\r\n class=\"tui-image-editor-d-flex tui-image-editor-flex-row tui-image-editor-align-items-center tui-image-editor-flex-nowrap\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n class=\"tie-sharpen\"\r\n [(ngModel)]=\"filterSharpenChecked\"\r\n (ngModelChange)=\"filterSharpenCheckedChanged($event)\"\r\n />\r\n <span>{{\r\n \"tui-image-editor-angular-submenus-filter-sharpen\" | translate\r\n }}</span>\r\n </label>\r\n </div>\r\n <div class=\"tui-image-editor-checkbox tui-image-editor-align-self-center\">\r\n <label\r\n class=\"tui-image-editor-d-flex tui-image-editor-flex-row tui-image-editor-align-items-center tui-image-editor-flex-nowrap\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n class=\"tie-emboss\"\r\n [(ngModel)]=\"filterEmbossChecked\"\r\n (ngModelChange)=\"filterEmbossCheckedChanged($event)\"\r\n />\r\n <span>{{\r\n \"tui-image-editor-angular-submenus-filter-emboss\" | translate\r\n }}</span>\r\n </label>\r\n </div>\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=\"tui-image-editor-submenu-align\">\r\n <div\r\n class=\"tui-image-editor-checkbox-group tui-image-editor-disabled\"\r\n style=\"margin-bottom: 7px\"\r\n >\r\n <div class=\"tui-image-editor-checkbox-wrap\">\r\n <div class=\"tui-image-editor-checkbox\">\r\n <label\r\n class=\"tui-image-editor-d-flex tui-image-editor-flex-row tui-image-editor-align-items-center tui-image-editor-flex-nowrap\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n class=\"tie-remove-white\"\r\n [(ngModel)]=\"filterWhiteRemovalChecked\"\r\n (ngModelChange)=\"filterWhiteRemovalCheckedChanged($event)\"\r\n />\r\n <span>{{\r\n \"tui-image-editor-angular-submenus-filter-removeWhite\"\r\n | translate\r\n }}</span>\r\n </label>\r\n </div>\r\n </div>\r\n <div\r\n class=\"tui-image-editor-newline tui-image-editor-range-wrap short tui-image-editor-d-flex tui-image-editor-flex-row tui-image-editor-flex-nowrap tui-image-editor-align-items-center\"\r\n >\r\n <label>{{\r\n \"tui-image-editor-angular-submenus-filter-removeWhite-distance\"\r\n | translate\r\n }}</label>\r\n <input\r\n type=\"range\"\r\n [(ngModel)]=\"filterWhiteRemovalDistance\"\r\n (ngModelChange)=\"filterWhiteRemovalDistanceChanged($event, true)\"\r\n (change)=\"filterWhiteRemovalDistanceChanged($event, false)\"\r\n min=\"0\"\r\n max=\"1\"\r\n step=\"0.001\"\r\n [disabled]=\"filterWhiteRemovalChecked == false\"\r\n />\r\n </div>\r\n </div>\r\n <div class=\"tui-image-editor-checkbox-group tui-image-editor-disabled\">\r\n <div class=\"tui-image-editor-checkbox\">\r\n <label\r\n class=\"tui-image-editor-d-flex tui-image-editor-flex-row tui-image-editor-align-items-center tui-image-editor-flex-nowrap\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n class=\"tie-brightness\"\r\n [(ngModel)]=\"filterBrightnessChecked\"\r\n (ngModelChange)=\"filterBrightnessCheckedChanged($event)\"\r\n />\r\n <span>{{\r\n \"tui-image-editor-angular-submenus-filter-brightness\" | translate\r\n }}</span>\r\n </label>\r\n </div>\r\n <div class=\"tui-image-editor-range-wrap short tui-image-editor-d-flex tui-image-editor-flex-row align-items-center tui-image-editor-my-2\">\r\n <input\r\n type=\"range\"\r\n [(ngModel)]=\"filterBrightnessValue\"\r\n (ngModelChange)=\"filterBrightnessValueChanged($event, true)\"\r\n (change)=\"filterBrightnessValueChanged($event, false)\"\r\n min=\"-1\"\r\n max=\"1\"\r\n step=\"0.03\"\r\n [disabled]=\"filterBrightnessChecked == false\"\r\n />\r\n </div>\r\n </div>\r\n <div class=\"tui-image-editor-checkbox-group tui-image-editor-disabled\">\r\n <div class=\"tui-image-editor-checkbox\">\r\n <label\r\n class=\"tui-image-editor-d-flex tui-image-editor-flex-row tui-image-editor-align-items-center tui-image-editor-flex-nowrap\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n class=\"tie-noise\"\r\n [(ngModel)]=\"filterNoiseChecked\"\r\n (ngModelChange)=\"filterNoiseCheckedChanged($event)\"\r\n />\r\n <span>{{\r\n \"tui-image-editor-angular-submenus-filter-noise\" | translate\r\n }}</span>\r\n </label>\r\n </div>\r\n <div class=\"tui-image-editor-range-wrap short tui-image-editor-d-flex tui-image-editor-flex-row align-items-center tui-image-editor-my-2\">\r\n <input\r\n type=\"range\"\r\n [(ngModel)]=\"filterNoiseValue\"\r\n (ngModelChange)=\"filterNoiseValueChanged($event, true)\"\r\n (change)=\"filterNoiseValueChanged($event, false)\"\r\n min=\"0\"\r\n max=\"1000\"\r\n step=\"10\"\r\n [disabled]=\"filterNoiseChecked == false\"\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"tui-image-editor-partition only-left-right\">\r\n <div></div>\r\n </div>\r\n <div class=\"tui-image-editor-submenu-align\">\r\n <div class=\"tui-image-editor-checkbox-group tui-image-editor-disabled\">\r\n <div class=\"tui-image-editor-checkbox\">\r\n <label\r\n class=\"tui-image-editor-d-flex tui-image-editor-flex-row tui-image-editor-align-items-center tui-image-editor-flex-nowrap\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n class=\"tie-pixelate\"\r\n [(ngModel)]=\"filterPixelateChecked\"\r\n (ngModelChange)=\"filterPixelateCheckedChanged($event)\"\r\n />\r\n <span>{{\r\n \"tui-image-editor-angular-submenus-filter-pixelate\" | translate\r\n }}</span>\r\n </label>\r\n </div>\r\n <div class=\"tui-image-editor-range-wrap short tui-image-editor-d-flex tui-image-editor-flex-row align-items-center tui-image-editor-my-2\">\r\n <input\r\n type=\"range\"\r\n [(ngModel)]=\"filterPixelateValue\"\r\n (ngModelChange)=\"filterPixelateValueChanged($event, true)\"\r\n (change)=\"filterPixelateValueChanged($event, false)\"\r\n min=\"2\"\r\n max=\"20\"\r\n step=\"1\"\r\n [disabled]=\"filterPixelateChecked == false\"\r\n />\r\n </div>\r\n </div>\r\n <div class=\"tui-image-editor-checkbox-group tui-image-editor-disabled\">\r\n <div class=\"tui-image-editor-newline tui-image-editor-checkbox-wrap\">\r\n <div class=\"tui-image-editor-checkbox\">\r\n <label\r\n class=\"tui-image-editor-d-flex tui-image-editor-flex-row tui-image-editor-align-items-center tui-image-editor-flex-nowrap\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n class=\"tie-color-filter\"\r\n [(ngModel)]=\"filterColorFilterChecked\"\r\n (ngModelChange)=\"filterColorFilterCheckedChanged($event)\"\r\n />\r\n <span>{{\r\n \"tui-image-editor-angular-submenus-filter-colorFilter\"\r\n | translate\r\n }}</span>\r\n </label>\r\n </div>\r\n </div>\r\n <div class=\"tui-image-editor-newline tui-image-editor-range-wrap short\">\r\n <label>{{\r\n \"tui-image-editor-angular-submenus-filter-colorFilter-threshold\"\r\n | translate\r\n }}</label>\r\n <div class=\"tie-colorfilter-threshold-range tui-image-editor-range tui-image-editor-d-flex tui-image-editor-flex-row align-items-center tui-image-editor-my-2\">\r\n <input\r\n type=\"range\"\r\n [(ngModel)]=\"filterColorFilterThreshold\"\r\n (ngModelChange)=\"filterColorFilterThresholdChanged($event, true)\"\r\n (change)=\"filterColorFilterThresholdChanged($event, false)\"\r\n min=\"0\"\r\n max=\"1\"\r\n step=\"0.02\"\r\n [disabled]=\"filterColorFilterChecked == false\"\r\n />\r\n </div>\r\n </div>\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=\"tui-image-editor-d-flex tui-image-editor-flex-row tui-image-editor-align-items-center\"\r\n >\r\n <div class=\"filter-color-item\">\r\n <div\r\n [class]=\"\r\n 'tie-filter-tint-color tui-image-editor-button tui-image-editor-button-color-picker tui-image-editor-d-flex tui-image-editor-flex-column tui-image-editor-align-items-center ' +\r\n (filterTintChecked ? 'active' : '')\r\n \"\r\n [title]=\"'tui-image-editor-angular-submenus-filter-tint' | translate\"\r\n >\r\n <input\r\n readonly\r\n class=\"tie-filter-tint-color-picker tui-image-editor-mb-2\"\r\n [(colorPicker)]=\"filterTintColor\"\r\n [style.background]=\"filterTintColor\"\r\n [cpOutputFormat]=\"'rgba'\"\r\n [cpPresetColors]=\"defaultFilterTintColors\"\r\n (colorPickerChange)=\"filterTintColorChanged($event)\"\r\n [cpUseRootViewContainer]=\"true\"\r\n />\r\n <label\r\n class=\"tui-image-editor-d-flex tui-image-editor-flex-row tui-image-editor-align-items-center tui-image-editor-flex-nowrap\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n class=\"tie-tint\"\r\n [(ngModel)]=\"filterTintChecked\"\r\n (ngModelChange)=\"filterTintCheckedChanged($event)\"\r\n />\r\n <span>{{\r\n \"tui-image-editor-angular-submenus-filter-tint\" | translate\r\n }}</span>\r\n </label>\r\n </div>\r\n </div>\r\n <div class=\"filter-color-item\">\r\n <div\r\n [class]=\"\r\n 'tie-filter-multiply-color tui-image-editor-button tui-image-editor-button-color-picker tui-image-editor-d-flex tui-image-editor-flex-column tui-image-editor-align-items-center ' +\r\n (filterMultiplyChecked ? 'active' : '')\r\n \"\r\n [title]=\"\r\n 'tui-image-editor-angular-submenus-filter-multiply' | translate\r\n \"\r\n >\r\n <input\r\n readonly\r\n class=\"tie-filter-multiply-color-picker tui-image-editor-mb-2\"\r\n [(colorPicker)]=\"filterMultiplyColor\"\r\n [style.background]=\"filterMultiplyColor\"\r\n [cpOutputFormat]=\"'hex'\"\r\n [cpPresetColors]=\"defaultFilterMultiplyColors\"\r\n (colorPickerChange)=\"filterMultiplyColorChanged($event)\"\r\n [cpUseRootViewContainer]=\"true\"\r\n />\r\n <label\r\n class=\"tui-image-editor-d-flex tui-image-editor-flex-row tui-image-editor-align-items-center tui-image-editor-flex-nowrap\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n class=\"tie-multiply\"\r\n [(ngModel)]=\"filterMultiplyChecked\"\r\n (ngModelChange)=\"filterMultiplyCheckedChanged($event)\"\r\n />\r\n <span>{{\r\n \"tui-image-editor-angular-submenus-filter-multiply\" | translate\r\n }}</span>\r\n </label>\r\n </div>\r\n </div>\r\n <div class=\"filter-color-item\">\r\n <div\r\n [class]=\"\r\n 'tie-filter-blend-color tui-image-editor-button tui-image-editor-button-color-picker tui-image-editor-d-flex tui-image-editor-flex-column tui-image-editor-align-items-center ' +\r\n (filterBlendChecked ? 'active' : '')\r\n \"\r\n [title]=\"'tui-image-editor-angular-submenus-filter-blend' | translate\"\r\n >\r\n <input\r\n readonly\r\n class=\"tie-filter-blend-color-picker tui-image-editor-mb-2\"\r\n [(colorPicker)]=\"filterBlendColor\"\r\n [style.background]=\"filterBlendColor\"\r\n [cpOutputFormat]=\"'rgba'\"\r\n [cpPresetColors]=\"defaultFilterBlendColors\"\r\n (colorPickerChange)=\"filterBlendColorChanged($event)\"\r\n [cpUseRootViewContainer]=\"true\"\r\n />\r\n <label\r\n class=\"tui-image-editor-d-flex tui-image-editor-flex-row tui-image-editor-align-items-center tui-image-editor-flex-nowrap\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n class=\"tie-blend\"\r\n [(ngModel)]=\"filterBlendChecked\"\r\n (ngModelChange)=\"filterBlendCheckedChanged($event)\"\r\n />\r\n <span>{{\r\n \"tui-image-editor-angular-submenus-filter-blend\" | translate\r\n }}</span>\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n" }]
|
|
342
|
+
}], ctorParameters: function () { return [{ type: i1.HistoryService }]; }, propDecorators: { imageEditor: [{
|
|
343
|
+
type: Input
|
|
344
|
+
}] } });
|
|
345
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3R1aS1pbWFnZS1lZGl0b3ItYW5ndWxhcjIvc3JjL2xpYi9zdWJtZW51cy9maWx0ZXIvZmlsdGVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3R1aS1pbWFnZS1lZGl0b3ItYW5ndWxhcjIvc3JjL2xpYi9zdWJtZW51cy9maWx0ZXIvZmlsdGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFxQixNQUFNLGVBQWUsQ0FBQztBQUVwRSxPQUFPLEVBQUUsYUFBYSxFQUFFLFVBQVUsRUFBZ0IsTUFBTSxjQUFjLENBQUM7QUFDdkUsT0FBTyxFQUFlLGVBQWUsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBRTdFLE9BQU8sRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLE1BQU0sYUFBYSxDQUFDOzs7Ozs7QUFPekQsTUFBTSxPQUFPLGVBQWU7SUEyQzFCLFlBQW9CLGNBQThCO1FBQTlCLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQXZDM0Msc0JBQWlCLEdBQVksS0FBSyxDQUFDO1FBQ25DLG9CQUFlLEdBQVcsR0FBRyxDQUFDO1FBRTlCLDJCQUFzQixHQUFZLEtBQUssQ0FBQztRQUN4Qyx1QkFBa0IsR0FBWSxLQUFLLENBQUM7UUFDcEMsd0JBQW1CLEdBQVksS0FBSyxDQUFDO1FBQ3JDLHdCQUFtQixHQUFZLEtBQUssQ0FBQztRQUNyQyx5QkFBb0IsR0FBWSxLQUFLLENBQUM7UUFDdEMseUJBQW9CLEdBQVksS0FBSyxDQUFDO1FBRXRDLDhCQUF5QixHQUFZLEtBQUssQ0FBQztRQUMzQywrQkFBMEIsR0FBVyxHQUFHLENBQUM7UUFFekMsNEJBQXVCLEdBQVksS0FBSyxDQUFDO1FBQ3pDLDBCQUFxQixHQUFXLENBQUMsQ0FBQztR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RUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7aUJBQ3REO2dCQUNELE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQzthQUM3RDtpQkFBTSxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUMzQyxNQUFNLFlBQVksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQztnQkFDckQsSUFBSSxJQUFJLElBQUksWUFBWSxFQUFFO29CQUN4QixJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO29CQUMvQixJQUFJLENBQUMscUJBQXFCLEdBQUcsS0FBSyxDQUFDO29CQUNuQyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsS0FBSyxDQUFDO2lCQUNqQzthQUNGO1FBQ0gsQ0FBQyxDQUFDO1FBQ0YsSUFBSSxRQUFRLEVBQUU7WUFDWixNQUFNLGlCQUFpQixFQUFFLENBQUM7U0FDM0I7YUFBTTtZQUNMLFVBQVUsQ0FBQyxLQUFLLElBQUksRUFBRTtnQkFDcEIsTUFBTSxpQkFBaUIsRUFBRSxDQUFDO1lBQzVCLENBQUMsQ0FBQyxDQUFDO1NBQ0o7SUFDSCxDQUFDOzs0R0FuZ0JVLGVBQWU7Z0dBQWYsZUFBZSxnSENaNUIscWtqQkFtWkE7MkZEdllhLGVBQWU7a0JBTDNCLFNBQVM7K0JBQ0Usa0NBQWtDO3FHQUtuQyxXQUFXO3NCQUFuQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgZGVmYXVsdENvbG9ycywgZmlsdGVyVHlwZSwgaGlzdG9yeU5hbWVzIH0gZnJvbSAnLi4vLi4vY29uc3RzJztcclxuaW1wb3J0IHsgSGlzdG9yeUl0ZW0sIEhpc3RvcnlJdGVtVHlwZSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvaGlzdG9yeS1pdGVtJztcclxuaW1wb3J0IHsgSGlzdG9yeVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9oaXN0b3J5LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyByZW1vdmVGaWx0ZXIsIHJnYmFUb09iamVjdCB9IGZyb20gJy4uLy4uL3V0aWxzJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAndHVpLWltYWdlLWVkaXRvci1zdWJtZW51cy1maWx0ZXInLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9maWx0ZXIuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2ZpbHRlci5jb21wb25lbnQuY3NzJ10sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBGaWx0ZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcbiAgQElucHV0KCkgaW1hZ2VFZGl0b3I6IGFueTtcclxuICBwdWJsaWMgYWN0aXZlT2JqZWN0SWQ6IG51bWJlcjtcclxuXHJcbiAgcHVibGljIGZpbHRlckJsdXJDaGVja2VkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIGZpbHRlckJsdXJWYWx1ZTogbnVtYmVyID0gMC4xO1xyXG5cclxuICBwdWJsaWMgZmlsdGVyR3JheXNjYWxlQ2hlY2tlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBmaWx0ZXJTZXBpYUNoZWNrZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgZmlsdGVyRW1ib3NzQ2hlY2tlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBmaWx0ZXJJbnZlcnRDaGVja2VkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIGZpbHRlclZpbnRhZ2VDaGVja2VkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIGZpbHRlclNoYXJwZW5DaGVja2VkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIHB1YmxpYyBmaWx0ZXJXaGl0ZVJlbW92YWxDaGVja2VkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIGZpbHRlcldoaXRlUmVtb3ZhbERpc3RhbmNlOiBudW1iZXIgPSAwLjU7XHJcblxyXG4gIHB1YmxpYyBmaWx0ZXJCcmlnaHRuZXNzQ2hlY2tlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBmaWx0ZXJCcmlnaHRuZXNzVmFsdWU6IG51bWJlciA9IDA7XHJcblxyXG4gIHB1YmxpYyBmaWx0ZXJOb2lzZUNoZWNrZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgZmlsdGVyTm9pc2VWYWx1ZTogbnVtYmVyID0gMTAwO1xyXG5cclxuICBwdWJsaWMgZmlsdGVyUGl4ZWxhdGVDaGVja2VkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIGZpbHRlclBpeGVsYXRlVmFsdWU6IG51bWJlciA9IDE1O1xyXG5cclxuICBwdWJsaWMgZmlsdGVyQ29sb3JGaWx0ZXJDaGVja2VkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIGZpbHRlckNvbG9yRmlsdGVyVGhyZXNob2xkOiBudW1iZXIgPSAwO1xyXG5cclxuICBwdWJsaWMgZGVmYXVsdEZpbHRlclRpbnRDb2xvcnM6IHN0cmluZ1tdID0gZGVmYXVsdENvbG9ycztcclxuICBwdWJsaWMgZmlsdGVyVGludENoZWNrZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgZmlsdGVyVGludENvbG9yOiBzdHJpbmcgPSAncmdiYSgzLCAxODksIDE1OCwgMC43KSc7XHJcblxyXG4gIHB1YmxpYyBkZWZhdWx0RmlsdGVyTXVsdGlwbHlDb2xvcnM6IHN0cmluZ1tdID0gZGVmYXVsdENvbG9ycztcclxuICBwdWJsaWMgZmlsdGVyTXVsdGlwbHlDaGVja2VkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIGZpbHRlck11bHRpcGx5Q29sb3I6IHN0cmluZyA9ICdyZ2IoODEsIDkyLCAyMzApJztcclxuXHJcbiAgcHVibGljIGRlZmF1bHRGaWx0ZXJCbGVuZENvbG9yczogc3RyaW5nW10gPSBkZWZhdWx0Q29sb3JzO1xyXG4gIHB1YmxpYyBmaWx0ZXJCbGVuZENoZWNrZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgZmlsdGVyQmxlbmRDb2xvcjogc3RyaW5nID0gJ3JnYmEoMjU1LCAxODcsIDU5LCAxKSc7XHJcblxyXG4gIHByaXZhdGUgaGlzdG9yeVNlcnZpY2VTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBoaXN0b3J5U2VydmljZTogSGlzdG9yeVNlcnZpY2UpIHt9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5oaXN0b3J5U2VydmljZVN1YnNjcmlwdGlvbiA9IHRoaXMuaGlzdG9yeVNlcnZpY2Uub25DaGFuZ2VFbWl0dGVyLnN1YnNjcmliZShcclxuICAgICAgKGl0ZW1zKSA9PlxyXG4gICAgICAgIGl0ZW1zICE9IG51bGwgJiYgaXRlbXMubGVuZ3RoICE9IDBcclxuICAgICAgICAgID8gdGhpcy5yZWJpbmRGaWVsZHMoaXRlbXMpXHJcbiAgICAgICAgICA6IHRoaXMucmViaW5kRmllbGRzKHRoaXMuaGlzdG9yeVNlcnZpY2UuaXRlbXMpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLmhpc3RvcnlTZXJ2aWNlU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlYmluZEZpZWxkcyhpdGVtczogSGlzdG9yeUl0ZW1bXSkge1xyXG4gICAgY29uc29sZS5kZWJ1ZyhpdGVtcyk7XHJcbiAgICBpZiAodGhpcy5pbWFnZUVkaXRvciAhPSBudWxsKSB7XHJcbiAgICAgIHRoaXMuZmlsdGVyQmx1ckNoZWNrZWQgPSB0aGlzLmltYWdlRWRpdG9yLmhhc0ZpbHRlcignYmx1cicpO1xyXG4gICAgICB0aGlzLmZpbHRlckJyaWdodG5lc3NDaGVja2VkID0gdGhpcy5pbWFnZUVkaXRvci5oYXNGaWx0ZXIoJ2JyaWdodG5lc3MnKTtcclxuICAgICAgaWYgKHRoaXMuZmlsdGVyQnJpZ2h0bmVzc0NoZWNrZWQpIHtcclxuICAgICAgICB0aGlzLmZpbHRlckJyaWdodG5lc3NWYWx1ZSA9IHRoaXMuZ2V0QXBwbGllZEZpbHRlckFyZ3VtZW50KFxyXG4gICAgICAgICAgaXRlbXMsXHJcbiAgICAgICAgICBmaWx0ZXJUeXBlLkJSSUdIVE5FU1MsXHJcbiAgICAgICAgICAwXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmZpbHRlckNvbG9yRmlsdGVyQ2hlY2tlZCA9XHJcbiAgICAgICAgdGhpcy5pbWFnZUVkaXRvci5oYXNGaWx0ZXIoJ3JlbW92ZUNvbG9yJykgJiZcclxuICAgICAgICB0aGlzLmhhc0FwcGxpZWRGaWx0ZXIoaXRlbXMsIGZpbHRlclR5cGUuUkVNT1ZFX0NPTE9SKTtcclxuICAgICAgaWYgKHRoaXMuZmlsdGVyQ29sb3JGaWx0ZXJDaGVja2VkKSB7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJDb2xvckZpbHRlclRocmVzaG9sZCA9IHRoaXMuZ2V0QXBwbGllZEZpbHRlckFyZ3VtZW50KFxyXG4gICAgICAgICAgaXRlbXMsXHJcbiAgICAgICAgICBmaWx0ZXJUeXBlLlJFTU9WRV9DT0xPUixcclxuICAgICAgICAgIDBcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuZmlsdGVyRW1ib3NzQ2hlY2tlZCA9IHRoaXMuaW1hZ2VFZGl0b3IuaGFzRmlsdGVyKCdlbWJvc3MnKTtcclxuICAgICAgdGhpcy5maWx0ZXJHcmF5c2NhbGVDaGVja2VkID0gdGhpcy5pbWFnZUVkaXRvci5oYXNGaWx0ZXIoJ2dyYXlzY2FsZScpO1xyXG4gICAgICB0aGlzLmZpbHRlckludmVydENoZWNrZWQgPSB0aGlzLmltYWdlRWRpdG9yLmhhc0ZpbHRlcignaW52ZXJ0Jyk7XHJcbiAgICAgIHRoaXMuZmlsdGVyTm9pc2VDaGVja2VkID0gdGhpcy5pbWFnZUVkaXRvci5oYXNGaWx0ZXIoJ25vaXNlJyk7XHJcbiAgICAgIGlmICh0aGlzLmZpbHRlck5vaXNlQ2hlY2tlZCkge1xyXG4gICAgICAgIHRoaXMuZmlsdGVyTm9pc2VWYWx1ZSA9IHRoaXMuZ2V0QXBwbGllZEZpbHRlckFyZ3VtZW50KFxyXG4gICAgICAgICAgaXRlbXMsXHJcbiAgICAgICAgICBmaWx0ZXJUeXBlLk5PSVNFLFxyXG4gICAgICAgICAgMFxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5maWx0ZXJQaXhlbGF0ZUNoZWNrZWQgPSB0aGlzLmltYWdlRWRpdG9yLmhhc0ZpbHRlcigncGl4ZWxhdGUnKTtcclxuICAgICAgaWYgKHRoaXMuZmlsdGVyUGl4ZWxhdGVDaGVja2VkKSB7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJQaXhlbGF0ZVZhbHVlID0gdGhpcy5nZXRBcHBsaWVkRmlsdGVyQXJndW1lbnQoXHJcbiAgICAgICAgICBpdGVtcyxcclxuICAgICAgICAgIGZpbHRlclR5cGUuUElYRUxBVEUsXHJcbiAgICAgICAgICAwXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmZpbHRlclNlcGlhQ2hlY2tlZCA9IHRoaXMuaW1hZ2VFZGl0b3IuaGFzRmlsdGVyKCdzZXBpYScpO1xyXG4gICAgICB0aGlzLmZpbHRlclNoYXJwZW5DaGVja2VkID0gdGhpcy5pbWFnZUVkaXRvci5oYXNGaWx0ZXIoJ3NoYXJwZW4nKTtcclxuICAgICAgdGhpcy5maWx0ZXJWaW50YWdlQ2hlY2tlZCA9IHRoaXMuaW1hZ2VFZGl0b3IuaGFzRmlsdGVyKCd2aW50YWdlJyk7XHJcbiAgICAgIHRoaXMuZmlsdGVyV2hpdGVSZW1vdmFsQ2hlY2tlZCA9XHJcbiAgICAgICAgdGhpcy5pbWFnZUVkaXRvci5oYXNGaWx0ZXIoJ3JlbW92ZUNvbG9yJykgJiZcclxuICAgICAgICB0aGlzLmhhc0FwcGxpZWRGaWx0ZXIoaXRlbXMsIGZpbHRlclR5cGUuUkVNT1ZFX1dISVRFKTtcclxuICAgICAgaWYgKHRoaXMuZmlsdGVyV2hpdGVSZW1vdmFsQ2hlY2tlZCkge1xyXG4gICAgICAgIHRoaXMuZmlsdGVyV2hpdGVSZW1vdmFsRGlzdGFuY2UgPSB0aGlzLmdldEFwcGxpZWRGaWx0ZXJBcmd1bWVudChcclxuICAgICAgICAgIGl0ZW1zLFxyXG4gICAgICAgICAgZmlsdGVyVHlwZS5SRU1PVkVfV0hJVEUsXHJcbiAgICAgICAgICAwXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5maWx0ZXJNdWx0aXBseUNoZWNrZWQgPVxyXG4gICAgICAgIHRoaXMuaW1hZ2VFZGl0b3IuaGFzRmlsdGVyKCdibGVuZENvbG9yJykgJiZcclxuICAgICAgICB0aGlzLmhhc0FwcGxpZWRGaWx0ZXIoaXRlbXMsIGZpbHRlclR5cGUuTVVMVElQTFkpO1xyXG4gICAgICBpZiAodGhpcy5maWx0ZXJNdWx0aXBseUNoZWNrZWQpIHtcclxuICAgICAgICB0aGlzLmZpbHRlck11bHRpcGx5Q29sb3IgPSB0aGlzLmdldEFwcGxpZWRGaWx0ZXJBcmd1bWVudChcclxuICAgICAgICAgIGl0ZW1zLFxyXG4gICAgICAgICAgZmlsdGVyVHlwZS5NVUxUSVBMWSxcclxuICAgICAgICAgIDBcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuZmlsdGVyVGludENoZWNrZWQgPVxyXG4gICAgICAgIHRoaXMuaW1hZ2VFZGl0b3IuaGFzRmlsdGVyKCdibGVuZENvbG9yJykgJiZcclxuICAgICAgICB0aGlzLmhhc0FwcGxpZWRGaWx0ZXIoaXRlbXMsIGZpbHRlclR5cGUuVElOVCk7XHJcbiAgICAgIGlmICh0aGlzLmZpbHRlclRpbnRDaGVja2VkKSB7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJUaW50Q29sb3IgPSB0aGlzLmdldEFwcGxpZWRGaWx0ZXJBcmd1bWVudChcclxuICAgICAgICAgIGl0ZW1zLFxyXG4gICAgICAgICAgZmlsdGVyVHlwZS5USU5ULFxyXG4gICAgICAgICAgMFxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5maWx0ZXJCbGVuZENoZWNrZWQgPVxyXG4gICAgICAgIHRoaXMuaW1hZ2VFZGl0b3IuaGFzRmlsdGVyKCdibGVuZENvbG9yJykgJiZcclxuICAgICAgICB0aGlzLmhhc0FwcGxpZWRGaWx0ZXIoaXRlbXMsIGZpbHRlclR5cGUuQkxFTkQpO1xyXG4gICAgICBpZiAodGhpcy5maWx0ZXJCbGVuZENoZWNrZWQpIHtcclxuICAgICAgICB0aGlzLmZpbHRlckJsZW5kQ29sb3IgPSB0aGlzLmdldEFwcGxpZWRGaWx0ZXJBcmd1bWVudChcclxuICAgICAgICAgIGl0ZW1zLFxyXG4gICAgICAgICAgZmlsdGVyVHlwZS5CTEVORCxcclxuICAgICAgICAgIDBcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldEFwcGxpZWRGaWx0ZXJBcmd1bWVudChcclxuICAgIGl0ZW1zOiBIaXN0b3J5SXRlbVtdLFxyXG4gICAgdHlwZTogZmlsdGVyVHlwZSxcclxuICAgIGluZGV4OiBudW1iZXJcclxuICApOiBhbnkge1xyXG4gICAgbGV0IHZhbGlkSXRlbXMgPSBpdGVtcy5maWx0ZXIoXHJcbiAgICAgIChmKSA9PiBmLmZpbHRlclR5cGUgPT09IHR5cGUgJiYgZi50eXBlID09PSBIaXN0b3J5SXRlbVR5cGUuQXBwbHlGaWx0ZXJcclxuICAgICk7XHJcbiAgICByZXR1cm4gdmFsaWRJdGVtc1t2YWxpZEl0ZW1zLmxlbmd0aCAtIDFdLmFyZ3NbaW5kZXhdO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBoYXNBcHBsaWVkRmlsdGVyKFxyXG4gICAgaGlzdG9yeUl0ZW1zOiBIaXN0b3J5SXRlbVtdLFxyXG4gICAgdHlwZTogZmlsdGVyVHlwZVxyXG4gICk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGhhc0ZpbHRlciA9IGZhbHNlO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoaXN0b3J5SXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgbGV0IGl0ZW0gPSBoaXN0b3J5SXRlbXNbaV07XHJcbiAgICAgIGlmIChcclxuICAgICAgICBpdGVtLnR5cGUgPT09IEhpc3RvcnlJdGVtVHlwZS5BcHBseUZpbHRlciAmJlxyXG4gICAgICAgIGl0ZW0uZmlsdGVyVHlwZSA9PT0gdHlwZVxyXG4gICAgICApIHtcclxuICAgICAgICBoYXNGaWx0ZXIgPSB0cnVlO1xyXG4gICAgICB9IGVsc2UgaWYgKFxyXG4gICAgICAgIGhhc0ZpbHRlciA9PSB0cnVlICYmXHJcbiAgICAgICAgW2ZpbHRlclR5cGUuVElOVCwgZmlsdGVyVHlwZS5CTEVORCwgZmlsdGVyVHlwZS5NVUxUSVBMWV0uc29tZShcclxuICAgICAgICAgICh0KSA9PiB0ID09PSB0eXBlXHJcbiAgICAgICAgKSAmJlxyXG4gICAgICAgIGl0ZW0udHlwZSA9PT0gSGlzdG9yeUl0ZW1UeXBlLlJlbW92ZUZpbHRlciAmJlxyXG4gICAgICAgIGl0ZW0uZmlsdGVyVHlwZSA9PT0gZmlsdGVyVHlwZS5CTEVORF9PUl9USU5UX09SX01VTFRJUExZXHJcbiAgICAgICkge1xyXG4gICAgICAgIGhhc0ZpbHRlciA9IGZhbHNlO1xyXG4gICAgICB9IGVsc2UgaWYgKFxyXG4gICAgICAgIGhhc0ZpbHRlciA9PSB0cnVlICYmXHJcbiAgICAgICAgW2ZpbHRlclR5cGUuUkVNT1ZFX0NPTE9SLCBmaWx0ZXJUeXBlLlJFTU9WRV9XSElURV0uc29tZShcclxuICAgICAgICAgICh0KSA9PiB0ID09PSB0eXBlXHJcbiAgICAgICAgKSAmJlxyXG4gICAgICAgIGl0ZW0udHlwZSA9PT0gSGlzdG9yeUl0ZW1UeXBlLlJlbW92ZUZpbHRlciAmJlxyXG4gICAgICAgIGl0ZW0uZmlsdGVyVHlwZSA9PT0gZmlsdGVyVHlwZS5SRU1PVkVfQ09MT1JfT1JfV0hJVEVcclxuICAgICAgKSB7XHJcbiAgICAgICAgaGFzRmlsdGVyID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBoYXNGaWx0ZXI7XHJcbiAgfVxyXG5cclxuICBmaWx0ZXJXaGl0ZVJlbW92YWxDaGVja2VkQ2hhbmdlZChuZXdWYWx1ZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy5maWx0ZXJBcHBseSgnd2hpdGUtcmVtb3ZhbCcpO1xyXG4gIH1cclxuXHJcbiAgZmlsdGVyV2hpdGVSZW1vdmFsRGlzdGFuY2VDaGFuZ2VkKG5ld1ZhbHVlOiBudW1iZXIsIGlzU2lsZW50OiBib29sZWFuKSB7XHJcbiAgICB0aGlzLmZpbHRlckFwcGx5KCd3aGl0ZS1yZW1vdmFsJywgaXNTaWxlbnQpO1xyXG4gIH1cclxuXHJcbiAgZmlsdGVyQnJpZ2h0bmVzc0NoZWNrZWRDaGFuZ2VkKG5ld1ZhbHVlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLmZpbHRlckFwcGx5KCdicmlnaHRuZXNzJyk7XHJcbiAgfVxyXG5cclxuICBmaWx0ZXJCcmlnaHRuZXNzVmFsdWVDaGFuZ2VkKG5ld1ZhbHVlOiBudW1iZXIsIGlzU2lsZW50OiBib29sZWFuKSB7XHJcbiAgICB0aGlzLmZpbHRlckFwcGx5KCdicmlnaHRuZXNzJywgaXNTaWxlbnQpO1xyXG4gIH1cclxuXHJcbiAgZmlsdGVyTm9pc2VDaGVja2VkQ2hhbmdlZChuZXdWYWx1ZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy5maWx0ZXJBcHBseSgnbm9pc2UnKTtcclxuICB9XHJcblxyXG4gIGZpbHRlck5vaXNlVmFsdWVDaGFuZ2VkKG5ld1ZhbHVlOiBudW1iZXIsIGlzU2lsZW50OiBib29sZWFuKSB7XHJcbiAgICB0aGlzLmZpbHRlckFwcGx5KCdub2lzZScsIGlzU2lsZW50KTtcclxuICB9XHJcblxyXG4gIGZpbHRlclBpeGVsYXRlQ2hlY2tlZENoYW5nZWQobmV3VmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuZmlsdGVyQXBwbHkoJ3BpeGVsYXRlJyk7XHJcbiAgfVxyXG5cclxuICBmaWx0ZXJQaXhlbGF0ZVZhbHVlQ2hhbmdlZChuZXdWYWx1ZTogbnVtYmVyLCBpc1NpbGVudDogYm9vbGVhbikge1xyXG4gICAgdGhpcy5maWx0ZXJBcHBseSgncGl4ZWxhdGUnLCBpc1NpbGVudCk7XHJcbiAgfVxyXG5cclxuICBmaWx0ZXJDb2xvckZpbHRlckNoZWNrZWRDaGFuZ2VkKG5ld1ZhbHVlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLmZpbHRlckFwcGx5KCdyZW1vdmVDb2xvcicpO1xyXG4gIH1cclxuXHJcbiAgZmlsdGVyQ29sb3JGaWx0ZXJUaHJlc2hvbGRDaGFuZ2VkKG5ld1ZhbHVlOiBudW1iZXIsIGlzU2lsZW50OiBib29sZWFuKSB7XHJcbiAgICB0aGlzLmZpbHRlckFwcGx5KCdyZW1vdmVDb2xvcicsIGlzU2lsZW50KTtcclxuICB9XHJcblxyXG4gIGZpbHRlclRpbnRDb2xvckNoYW5nZWQobmV3Q29sb3I6IHN0cmluZykge1xyXG4gICAgdGhpcy5maWx0ZXJBcHBseSgndGludCcpO1xyXG4gIH1cclxuXHJcbiAgZmlsdGVyVGludENoZWNrZWRDaGFuZ2VkKG5ld1ZhbHVlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLmZpbHRlckFwcGx5KCd0aW50Jyk7XHJcbiAgICBpZiAodGhpcy5maWx0ZXJUaW50Q2hlY2tlZCkge1xyXG4gICAgICB0aGlzLmZpbHRlck11bHRpcGx5Q2hlY2tlZCA9IGZhbHNlO1xyXG4gICAgICB0aGlzLmZpbHRlckJsZW5kQ2hlY2tlZCA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZmlsdGVyTXVsdGlwbHlDb2xvckNoYW5nZWQobmV3Q29sb3I6IHN0cmluZykge1xyXG4gICAgdGhpcy5maWx0ZXJBcHBseSgnbXVsdGlwbHknKTtcclxuICB9XHJcblxyXG4gIGZpbHRlck11bHRpcGx5Q2hlY2tlZENoYW5nZWQobmV3VmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuZmlsdGVyQXBwbHkoJ211bHRpcGx5Jyk7XHJcbiAgICBpZiAodGhpcy5maWx0ZXJNdWx0aXBseUNoZWNrZWQpIHtcclxuICAgICAgdGhpcy5maWx0ZXJUaW50Q2hlY2tlZCA9IGZhbHNlO1xyXG4gICAgICB0aGlzLmZpbHRlckJsZW5kQ2hlY2tlZCA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZmlsdGVyQmxlbmRDb2xvckNoYW5nZWQobmV3Q29sb3I6IHN0cmluZykge1xyXG4gICAgdGhpcy5maWx0ZXJBcHBseSgnYmxlbmQnKTtcclxuICB9XHJcblxyXG4gIGZpbHRlckJsZW5kQ2hlY2tlZENoYW5nZWQobmV3VmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuZmlsdGVyQXBwbHkoJ2JsZW5kJyk7XHJcbiAgICBpZiAodGhpcy5maWx0ZXJCbGVuZENoZWNrZWQpIHtcclxuICAgICAgdGhpcy5maWx0ZXJNdWx0aXBseUNoZWNrZWQgPSBmYWxzZTtcclxuICAgICAgdGhpcy5maWx0ZXJUaW50Q2hlY2tlZCA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZmlsdGVyQmx1ckNoZWNrZWRDaGFuZ2VkKG5ld1ZhbHVlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLmZpbHRlckFwcGx5KCdibHVyJyk7XHJcbiAgfVxyXG5cclxuICBmaWx0ZXJHcmF5c2NhbGVDaGVja2VkQ2hhbmdlZChuZXdWYWx1ZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy5maWx0ZXJBcHBseSgnZ3JheXNjYWxlJyk7XHJcbiAgfVxyXG5cclxuICBmaWx0ZXJTZXBpYUNoZWNrZWRDaGFuZ2VkKG5ld1ZhbHVlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLmZpbHRlckFwcGx5KCdzZXBpYScpO1xyXG4gIH1cclxuXHJcbiAgZmlsdGVyRW1ib3NzQ2hlY2tlZENoYW5nZWQobmV3VmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuZmlsdGVyQXBwbHkoJ2VtYm9zcycpO1xyXG4gIH1cclxuXHJcbiAgZmlsdGVySW52ZXJ0Q2hlY2tlZENoYW5nZWQobmV3VmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuZmlsdGVyQXBwbHkoJ2ludmVydCcpO1xyXG4gIH1cclxuXHJcbiAgZmlsdGVyVmludGFnZUNoZWNrZWRDaGFuZ2VkKG5ld1ZhbHVlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLmZpbHRlckFwcGx5KCd2aW50YWdlJyk7XHJcbiAgfVxyXG5cclxuICBmaWx0ZXJTaGFycGVuQ2hlY2tlZENoYW5nZWQobmV3VmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuZmlsdGVyQXBwbHkoJ3NoYXJwZW4nKTtcclxuICB9XHJcblxyXG4gIGZpbHRlckFwcGx5KFxyXG4gICAgdHlwZTpcclxuICAgICAgfCAnd2hpdGUtcmVtb3ZhbCdcclxuICAgICAgfCAnYnJpZ2h0bmVzcydcclxuICAgICAgfCAnbm9pc2UnXHJcbiAgICAgIHwgJ3BpeGVsYXRlJ1xyXG4gICAgICB8ICdyZW1vdmVDb2xvcidcclxuICAgICAgfCAnYmx1cidcclxuICAgICAgfCAnYmxlbmQnXHJcbiAgICAgIHwgJ211bHRpcGx5J1xyXG4gICAgICB8ICd0aW50J1xyXG4gICAgICB8ICdncmF5c2NhbGUnXHJcbiAgICAgIHwgJ3NlcGlhJ1xyXG4gICAgICB8ICdlbWJvc3MnXHJcbiAgICAgIHwgJ2ludmVydCdcclxuICAgICAgfCAndmludGFnZSdcclxuICAgICAgfCAnc2hhcnBlbicsXHJcbiAgICBpc1NpbGVudDogYm9vbGVhbiA9IGZhbHNlXHJcbiAgKSB7XHJcbiAgICBzd2l0Y2ggKHR5cGUpIHtcclxuICAgICAgY2FzZSAnd2hpdGUtcmVtb3ZhbCc6XHJcbiAgICAgICAgdGhpcy5maWx0ZXJBcHBseUNvbmZpcm1lZChcclxuICAgICAgICAgIHRoaXMuZmlsdGVyV2hpdGVSZW1vdmFsQ2hlY2tlZCxcclxuICAgICAgICAgICdyZW1vdmVDb2xvcicsXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGNvbG9yOiAnI0ZGRkZGRicsXHJcbiAgICAgICAgICAgIHVzZUFscGhhOiBmYWxzZSxcclxuICAgICAgICAgICAgZGlzdGFuY2U6IHRoaXMuZmlsdGVyV2hpdGVSZW1vdmFsRGlzdGFuY2UsXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgaXNTaWxlbnRcclxuICAgICAgICApO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdicmlnaHRuZXNzJzpcclxuICAgICAgICB0aGlzLmZpbHRlckFwcGx5Q29uZmlybWVkKFxyXG4gICAgICAgICAgdGhpcy5maWx0ZXJCcmlnaHRuZXNzQ2hlY2tlZCxcclxuICAgICAgICAgICdicmlnaHRuZXNzJyxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgYnJpZ2h0bmVzczogdGhpcy5maWx0ZXJCcmlnaHRuZXNzVmFsdWUsXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgaXNTaWxlbnRcclxuICAgICAgICApO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdub2lzZSc6XHJcbiAgICAgICAgdGhpcy5maWx0ZXJBcHBseUNvbmZpcm1lZChcclxuICAgICAgICAgIHRoaXMuZmlsdGVyTm9pc2VDaGVja2VkLFxyXG4gICAgICAgICAgJ25vaXNlJyxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbm9pc2U6IHRoaXMuZmlsdGVyTm9pc2VWYWx1ZSxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBpc1NpbGVudFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ3BpeGVsYXRlJzpcclxuICAgICAgICB0aGlzLmZpbHRlckFwcGx5Q29uZmlybWVkKFxyXG4gICAgICAgICAgdGhpcy5maWx0ZXJQaXhlbGF0ZUNoZWNrZWQsXHJcbiAgICAgICAgICAncGl4ZWxhdGUnLFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBibG9ja3NpemU6IHRoaXMuZmlsdGVyUGl4ZWxhdGVWYWx1ZSxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBpc1NpbGVudFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ3JlbW92ZUNvbG9yJzpcclxuICAgICAgICB0aGlzLmZpbHRlckFwcGx5Q29uZmlybWVkKFxyXG4gICAgICAgICAgdGhpcy5maWx0ZXJDb2xvckZpbHRlckNoZWNrZWQsXHJcbiAgICAgICAgICAncmVtb3ZlQ29sb3InLFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBjb2xvcjogJyNGRkZGRkYnLFxyXG4gICAgICAgICAgICBkaXN0YW5jZTogdGhpcy5maWx0ZXJDb2xvckZpbHRlclRocmVzaG9sZCxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBpc1NpbGVudFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ2JsdXInOlxyXG4gICAgICAgIHRoaXMuZmlsdGVyQXBwbHlDb25maXJtZWQoXHJcbiAgICAgICAgICB0aGlzLmZpbHRlckJsdXJDaGVja2VkLFxyXG4gICAgICAgICAgJ2JsdXInLFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBibHVyOiB0aGlzLmZpbHRlckJsdXJWYWx1ZSxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBpc1NpbGVudFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ2JsZW5kJzpcclxuICAgICAgICB0aGlzLmZpbHRlckFwcGx5Q29uZmlybWVkKFxyXG4gICAgICAgICAgdGhpcy5maWx0ZXJCbGVuZENoZWNrZWQsXHJcbiAgICAgICAgICAnYmxlbmRDb2xvcicsXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIG1vZGU6ICdhZGQnLFxyXG4gICAgICAgICAgICBjb2xvcjogdGhpcy5maWx0ZXJCbGVuZENvbG9yLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIGlzU2lsZW50XHJcbiAgICAgICAgKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnbXVsdGlwbHknOlxyXG4gICAgICAgIHRoaXMuZmlsdGVyQXBwbHlDb25maXJtZWQoXHJcbiAgICAgICAgICB0aGlzLmZpbHRlck11bHRpcGx5Q2hlY2tlZCxcclxuICAgICAgICAgICdibGVuZENvbG9yJyxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbW9kZTogJ211bHRpcGx5JyxcclxuICAgICAgICAgICAgY29sb3I6IHRoaXMuZmlsdGVyTXVsdGlwbHlDb2xvcixcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBpc1NpbGVudFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ3RpbnQnOlxyXG4gICAgICAgIGxldCByZ2JUaW50ID0gcmdiYVRvT2JqZWN0KHRoaXMuZmlsdGVyVGludENvbG9yKTtcclxuXHJcbiAgICAgICAgdGhpcy5maWx0ZXJBcHBseUNvbmZpcm1lZChcclxuICAgICAgICAgIHRoaXMuZmlsdGVyVGludENoZWNrZWQsXHJcbiAgICAgICAgICAnYmxlbmRDb2xvcicsXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIG1vZGU6ICd0aW50JyxcclxuICAgICAgICAgICAgY29sb3I6IHJnYlRpbnQuaGV4U3RyaW5nLFxyXG4gICAgICAgICAgICBhbHBoYTogcmdiVGludC5hbHBoYSxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBpc1NpbGVudFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ2dyYXlzY2FsZSc6XHJcbiAgICAgICAgdGhpcy5maWx0ZXJBcHBseUNvbmZpcm1lZChcclxuICAgICAgICAgIHRoaXMuZmlsdGVyR3JheXNjYWxlQ2hlY2tlZCxcclxuICAgICAgICAgIHR5cGUsXHJcbiAgICAgICAgICB7fSxcclxuICAgICAgICAgIGlzU2lsZW50XHJcbiAgICAgICAgKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnc2VwaWEnOlxyXG4gICAgICAgIHRoaXMuZmlsdGVyQXBwbHlDb25maXJtZWQodGhpcy5maWx0ZXJTZXBpYUNoZWNrZWQsIHR5cGUsIHt9LCBpc1NpbGVudCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ2VtYm9zcyc6XHJcbiAgICAgICAgdGhpcy5maWx0ZXJBcHBseUNvbmZpcm1lZCh0aGlzLmZpbHRlckVtYm9zc0NoZWNrZWQsIHR5cGUsIHt9LCBpc1NpbGVudCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ2ludmVydCc6XHJcbiAgICAgICAgdGhpcy5maWx0ZXJBcHBseUNvbmZpcm1lZCh0aGlzLmZpbHRlckludmVydENoZWNrZWQsIHR5cGUsIHt9LCBpc1NpbGVudCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ3ZpbnRhZ2UnOlxyXG4gICAgICAgIHRoaXMuZmlsdGVyQXBwbHlDb25maXJtZWQoXHJcbiAgICAgICAgICB0aGlzLmZpbHRlclZpbnRhZ2VDaGVja2VkLFxyXG4gICAgICAgICAgdHlwZSxcclxuICAgICAgICAgIHt9LFxyXG4gICAgICAgICAgaXNTaWxlbnRcclxuICAgICAgICApO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdzaGFycGVuJzpcclxuICAgICAgICB0aGlzLmZpbHRlckFwcGx5Q29uZmlybWVkKFxyXG4gICAgICAgICAgdGhpcy5maWx0ZXJTaGFycGVuQ2hlY2tlZCxcclxuICAgICAgICAgIHR5cGUsXHJcbiAgICAgICAgICB7fSxcclxuICAgICAgICAgIGlzU2lsZW50XHJcbiAgICAgICAgKTtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIGZpbHRlckFwcGx5Q29uZmlybWVkKFxyXG4gICAgYXBwbHlpbmc6IGJvb2xlYW4sXHJcbiAgICB0eXBlOlxyXG4gICAgICB8ICdyZW1vdmVDb2xvcidcclxuICAgICAgfCAnYnJpZ2h0bmVzcydcclxuICAgICAgfCAnbm9pc2UnXHJcbiAgICAgIHwgJ3BpeGVsYXRlJ1xyXG4gICAgICB8ICdibHVyJ1xyXG4gICAgICB8ICdibGVuZENvbG9yJ1xyXG4gICAgICB8ICdncmF5c2NhbGUnXHJcbiAgICAgIHwgJ3NlcGlhJ1xyXG4gICAgICB8ICdlbWJvc3MnXHJcbiAgICAgIHwgJ2ludmVydCdcclxuICAgICAgfCAndmludGFnZSdcclxuICAgICAgfCAnc2hhcnBlbicsXHJcbiAgICBvcHRpb25zOiBhbnksXHJcbiAgICBpc1NpbGVudDogYm9vbGVhbiA9IGZhbHNlXHJcbiAgKSB7XHJcbiAgICBsZXQgZnVuY3Rpb25Ub0V4ZWN1dGUgPSBhc3luYyAoKSA9PiB7XHJcbiAgICAgIGlmIChhcHBseWluZykge1xyXG4gICAgICAgIGlmICh0eXBlID09PSAnYmxlbmRDb2xvcicgJiYgdGhpcy5pbWFnZUVkaXRvci5oYXNGaWx0ZXIoJ2JsZW5kQ29sb3InKSkge1xyXG4gICAgICAgICAgc3dpdGNoIChvcHRpb25zLm1vZGUpIHtcclxuICAgICAgICAgICAgY2FzZSAnYWRkJzpcclxuICAgICAgICAgICAgICB0aGlzLmZpbHRlclRpbnRDaGVja2VkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgdGhpcy5maWx0ZXJNdWx0aXBseUNoZWNrZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAnbXVsdGlwbHknOlxyXG4gICAgICAgICAgICAgIHRoaXMuZmlsdGVyVGludENoZWNrZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICB0aGlzLmZpbHRlckJsZW5kQ2hlY2tlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlICd0aW50JzpcclxuICAgICAgICAgICAgICB0aGlzLmZpbHRlckJsZW5kQ2hlY2tlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgIHRoaXMuZmlsdGVyTXVsdGlwbHlDaGVja2VkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBhd2FpdCByZW1vdmVGaWx0ZXIodGhpcy5pbWFnZUVkaXRvciwgdHlwZSwgaXNTaWxlbnQpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoXHJcbiAgICAgICAgICB0eXBlID09PSAncmVtb3ZlQ29sb3InICYmXHJcbiAgICAgICAgICB0aGlzLmltYWdlRWRpdG9yLmhhc0ZpbHRlcigncmVtb3ZlQ29sb3InKVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgaWYgKG9wdGlvbnMudXNlQWxwaGEgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aGlzLmZpbHRlckNvbG9yRmlsdGVyQ2hlY2tlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5maWx0ZXJXaGl0ZVJlbW92YWxDaGVja2VkID0gZmFsc2U7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBhd2FpdCByZW1vdmVGaWx0ZXIodGhpcy5pbWFnZUVkaXRvciwgdHlwZSwgaXNTaWxlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBhd2FpdCB0aGlzLmltYWdlRWRpdG9yLmFwcGx5RmlsdGVyKHR5cGUsIG9wdGlvbnMsIGlzU2lsZW50KTtcclxuICAgICAgfSBlbHNlIGlmICh0aGlzLmltYWdlRWRpdG9yLmhhc0ZpbHRlcih0eXBlKSkge1xyXG4gICAgICAgIGF3YWl0IHJlbW92ZUZpbHRlcih0aGlzLmltYWdlRWRpdG9yLCB0eXBlLCBpc1NpbGVudCk7XHJcbiAgICAgICAgaWYgKHR5cGUgPT0gJ2JsZW5kQ29sb3InKSB7XHJcbiAgICAgICAgICB0aGlzLmZpbHRlclRpbnRDaGVja2VkID0gZmFsc2U7XHJcbiAgICAgICAgICB0aGlzLmZpbHRlck11bHRpcGx5Q2hlY2tlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy5maWx0ZXJCbGVuZENoZWNrZWQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgICBpZiAoaXNTaWxlbnQpIHtcclxuICAgICAgYXdhaXQgZnVuY3Rpb25Ub0V4ZWN1dGUoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHNldFRpbWVvdXQoYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgIGF3YWl0IGZ1bmN0aW9uVG9FeGVjdXRlKCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCI8ZGl2XHJcbiAgY2xhc3M9XCJ0dWktaW1hZ2UtZWRpdG9yLW1lbnUtZmlsdGVyIHR1aS1pbWFnZS1lZGl0b3ItZC1mbGV4IHR1aS1pbWFnZS1lZGl0b3ItanVzdGlmeS1jb250ZW50LWNlbnRlclwiXHJcbj5cclxuICA8ZGl2XHJcbiAgICBjbGFzcz1cInR1aS1pbWFnZS1lZGl0b3Itc3VibWVudS1pdGVtIHR1aS1pbWFnZS1lZGl0b3ItZC1mbGV4IHR1aS1pbWFnZS1lZGl0b3ItZmxleC1yb3cgdHVpLWltYWdlLWVkaXRvci1hbGlnbi1pdGVtcy1jZW50ZXIgdHVpLWltYWdlLWVkaXRvci1vdmVyZmxvd2FibGUteCB0dWktaW1hZ2UtZWRpdG9yLXB5LTNcIlxyXG4gID5cclxuICAgIDxkaXYgY2xhc3M9XCJ0dWktaW1hZ2UtZWRpdG9yLXN1Ym1lbnUtYWxpZ25cIj5cclxuICAgICAgPGRpdlxyXG4gICAgICAgIGNsYXNzPVwidHVpLWltYWdlLWVkaXRvci1jaGVja2JveC13cmFwIGZpeGVkLXdpZHRoIHR1aS1pbWFnZS1lZGl0b3ItZC1mbGV4IHR1aS1pbWFnZS1lZGl0b3ItZmxleC1yb3cgdHVpLWltYWdlLWVkaXRvci1mbGV4LXdyYXAgdHVpLWltYWdlLWVkaXRvci1qdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0dWktaW1hZ2UtZWRpdG9yLWNoZWNrYm94IHR1aS1pbWFnZS1lZGl0b3ItYWxpZ24tc2VsZi1jZW50ZXJcIj5cclxuICAgICAgICAgIDxsYWJlbFxyXG4gICAgICAgICAgICBjbGFzcz1cInR1aS1pbWFnZS1lZGl0b3ItZC1mbGV4IHR1aS1pbWFnZS1lZGl0b3ItZmxleC1yb3cgdHVpLWltYWdlLWVkaXRvci1hbGlnbi1pdGVtcy1jZW50ZXIgdHVpLWltYWdlLWVkaXRvci1mbGV4LW5vd3JhcFwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJ0aWUtZ3JheXNjYWxlXCJcclxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImZpbHRlckdyYXlzY2FsZUNoZWNrZWRcIlxyXG4gICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImZpbHRlckdyYXlzY2FsZUNoZWNrZWRDaGFuZ2VkKCRldmVudClcIlxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICA8c3Bhbj57e1xyXG4gICAgICAgICAgICAgIFwidHVpLWltYWdlLWVkaXRvci1hbmd1bGFyLXN1Ym1lbnVzLWZpbHRlci1ncmF5c2NhbGVcIiB8IHRyYW5zbGF0ZVxyXG4gICAgICAgICAgICB9fTwvc3Bhbj5cclxuICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInR1aS1pbWFnZS1lZGl0b3ItY2hlY2tib3ggdHVpLWltYWdlLWVkaXRvci1hbGlnbi1zZWxmLWNlbnRlclwiPlxyXG4gICAgICAgICAgPGxhYmVsXHJcbiAgICAgICAgICAgIGNsYXNzPVwidHVpLWltYWdlLWVkaXRvci1kLWZsZXggdHVpLWltYWdlLWVkaXRvci1mbGV4LXJvdyB0dWktaW1hZ2UtZWRpdG9yLWFsaWduLWl0ZW1zLWNlbnRlciB0dWktaW1hZ2UtZWRpdG9yLWZsZXgtbm93cmFwXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcclxuICAgICAgICAgICAgICBjbGFzcz1cInRpZS1pbnZlcnRcIlxyXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZmlsdGVySW52ZXJ0Q2hlY2tlZFwiXHJcbiAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiZmlsdGVySW52ZXJ0Q2hlY2tlZENoYW5nZWQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgIDxzcGFuPnt7XHJcbiAgICAgICAgICAgICAgXCJ0dWktaW1hZ2UtZWRpdG9yLWFuZ3VsYXItc3VibWVudXMtZmlsdGVyLWludmVydFwiIHwgdHJhbnNsYXRlXHJcbiAgICAgICAgICAgIH19PC9zcGFuPlxyXG4gICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidHVpLWltYWdlLWVkaXRvci1jaGVja2JveCB0dWktaW1hZ2UtZWRpdG9yLWFsaWduLXNlbGYtY2VudGVyXCI+XHJcbiAgICAgICAgICA8bGFiZWxcclxuICAgICAgICAgICAgY2xhc3M9XCJ0dWktaW1hZ2UtZWRpdG9yLWQtZmxleCB0dWktaW1hZ2UtZWRpdG9yLWZsZXgtcm93IHR1aS1pbWFnZS1lZGl0b3ItYWxpZ24taXRlbXMtY2VudGVyIHR1aS1pbWFnZS1lZGl0b3ItZmxleC1ub3dyYXBcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxyXG4gICAgICAgICAgICAgIGNsYXNzPVwidGllLXNlcGlhXCJcclxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImZpbHRlclNlcGlhQ2hlY2tlZFwiXHJcbiAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiZmlsdGVyU2VwaWFDaGVja2VkQ2hhbmdlZCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPHNwYW4+e3tcclxuICAgICAgICAgICAgICBcInR1aS1pbWFnZS1lZGl0b3ItYW5ndWxhci1zdWJtZW51cy1maWx0ZXItc2VwaWFcIiB8IHRyYW5zbGF0ZVxyXG4gICAgICAgICAgICB9fTwvc3Bhbj5cclxuICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInR1aS1pbWFnZS1lZGl0b3ItY2hlY2tib3ggdHVpLWltYWdlLWVkaXRvci1hbGlnbi1zZWxmLWNlbnRlclwiPlxyXG4gICAgICAgICAgPGxhYmVsXHJcbiAgICAgICAgICAgIGNsYXNzPVwidHVpLWltYWdlLWVkaXRvci1kLWZsZXggdHVpLWltYWdlLWVkaXRvci1mbGV4LXJvdyB0dWktaW1hZ2UtZWRpdG9yLWFsaWduLWl0ZW1zLWNlbnRlciB0dWktaW1hZ2UtZWRpdG9yLWZsZXgtbm93cmFwXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcclxuICAgICAgICAgICAgICBjbGFzcz1cInRpZS12aW50YWdlXCJcclxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImZpbHRlclZpbnRhZ2VDaGVja2VkXCJcclxuICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJmaWx0ZXJWaW50YWdlQ2hlY2tlZENoYW5nZWQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgIDxzcGFuPnt7XHJcbiAgICAgICAgICAgICAgXCJ0dWktaW1hZ2UtZWRpdG9yLWFuZ3VsYXItc3VibWVudXMtZmlsdGVyLXNlcGlhMlwiIHwgdHJhbnNsYXRlXHJcbiAgICAgICAgICAgIH19PC9zcGFuPlxyXG4gICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidHVpLWltYWdlLWVkaXRvci1jaGVja2JveCB0dWktaW1hZ2UtZWRpdG9yLWFsaWduLXNlbGYtY2VudGVyXCI+XHJcbiAgICAgICAgICA8bGFiZWxcclxuICAgICAgICAgICAgY2xhc3M9XCJ0dWktaW1hZ2UtZWRpdG9yLWQtZmxleCB0dWktaW1hZ2UtZWRpdG9yLWZsZXgtcm93IHR1aS1pbWFnZS1lZGl0b3ItYWxpZ24taXRlbXMtY2VudGVyIHR1aS1pbWFnZS1lZGl0b3ItZmxleC1ub3dyYXBcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxyXG4gICAgICAgICAgICAgIGNsYXNzPVwidGllLWJsdXJcIlxyXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZmlsdGVyQmx1ckNoZWNrZWRcIlxyXG4gICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImZpbHRlckJsdXJDaGVja2VkQ2hhbmdlZCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPHNwYW4+e3tcclxuICAgICAgICAgICAgICBcInR1aS1pbWFnZS1lZGl0b3ItYW5ndWxhci1zdWJtZW51cy1maWx0ZXItYmx1clwiIHwgdHJhbnNsYXRlXHJcbiAgICAgICAgICAgIH19PC9zcGFuPlxyXG4gICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidHVpLWltYWdlLWVkaXRvci1jaGVja2JveCB0dWktaW1hZ2UtZWRpdG9yLWFsaWduLXNlbGYtY2VudGVyXCI+XHJcbiAgICAgICAgICA8bGFiZWxcclxuICAgICAgICAgICAgY2xhc3M9XCJ0dWktaW1hZ2UtZWRpdG9yLWQtZmxleCB0dWktaW1hZ2UtZWRpdG9yLWZsZXgtcm93IHR1aS1pbWFnZS1lZGl0b3ItYWxpZ24taXRlbXMtY2VudGVyIHR1aS1pbWFnZS1lZGl0b3ItZmxleC1ub3dyYXBcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxyXG4gICAgICAgICAgICAgIGNsYXNzPVwidGllLXNoYXJwZW5cIlxyXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZmlsdGVyU2hhcnBlbkNoZWNrZWRcIlxyXG4gICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImZpbHRlclNoYXJwZW5DaGVja2VkQ2hhbmdlZCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPHNwYW4+e3tcclxuICAgICAgICAgICAgICBcInR1aS1pbWFnZS1lZGl0b3ItYW5ndWxhci1zdWJtZW51cy1maWx0ZXItc2hhcnBlblwiIHwgdHJhbnNsYXRlXHJcbiAgICAgICAgICAgIH19PC9zcGFuPlxyXG4gICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidHVpLWltYWdlLWVkaXRvci1jaGVja2JveCB0dWktaW1hZ2UtZWRpdG9yLWFsaWduLXNlbGYtY2VudGVyXCI+XHJcbiAgICAgICAgICA8bGFiZWxcclxuICAgICAgICAgICAgY2xhc3M9XCJ0dWktaW1hZ2UtZWRpdG9yLWQtZmxleCB0dWktaW1hZ2UtZWRpdG9yLWZsZXgtcm93IHR1aS1pbWFnZS1lZGl0b3ItYWxpZ24taXRlbXMtY2VudGVyIHR1aS1pbWFnZS1lZGl0b3ItZmxleC1ub3dyYXBcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxyXG4gICAgICAgICAgICAgIGNsYXNzPVwidGllLWVtYm9zc1wiXHJcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJmaWx0ZXJFbWJvc3NDaGVja2VkXCJcclxuICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJmaWx0ZXJFbWJvc3NDaGVja2VkQ2hhbmdlZCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPHNwYW4+e3tcclxuICAgICAgICAgICAgICBcInR1aS1pbWFnZS1lZGl0b3ItYW5ndWxhci1zdWJtZW51cy1maWx0ZXItZW1ib3NzXCIgfCB0cmFuc2xhdGVcclxuICAgICAgICAgICAgfX08L3NwYW4+XHJcbiAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cInR1aS1pbWFnZS1lZGl0b3ItcGFydGl0aW9uXCI+XHJcbiAgICAgIDxkaXY+PC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJ0dWktaW1hZ2UtZWRpdG9yLXN1Ym1lbnUtYWxpZ25cIj5cclxuICAgICAgPGRpdlxyXG4gICAgICAgIGNsYXNzPVwidHVpLWltYWdlLWVkaXRvci1jaGVja2JveC1ncm91cCB0dWktaW1hZ2UtZWRpdG9yLWRpc2FibGVkXCJcclxuICAgICAgICBzdHlsZT1cIm1hcmdpbi1ib3R0b206IDdweFwiXHJcbiAgICAgID5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidHVpLWltYWdlLWVkaXRvci1jaGVja2JveC13cmFwXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidHVpLWltYWdlLWVkaXRvci1jaGVja2JveFwiPlxyXG4gICAgICAgICAgICA8bGFiZWxcclxuICAgICAgICAgICAgICBjbGFzcz1cInR1aS1pbWFnZS1lZGl0b3ItZC1mbGV4IHR1aS1pbWFnZS1lZGl0b3ItZmxleC1yb3cgdHVpLWltYWdlLWVkaXRvci1hbGlnbi1pdGVtcy1jZW50ZXIgdHVpLWltYWdlLWVkaXRvci1mbGV4LW5vd3JhcFwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInRpZS1yZW1vdmUtd2hpdGVcIlxyXG4gICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJmaWx0ZXJXaGl0ZVJlbW92YWxDaGVja2VkXCJcclxuICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImZpbHRlcldoaXRlUmVtb3ZhbENoZWNrZWRDaGFuZ2VkKCRldmVudClcIlxyXG4gICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgPHNwYW4+e3tcclxuICAgICAgICAgICAgICAgIFwidHVpLWltYWdlLWVkaXRvci1hbmd1bGFyLXN1Ym1lbnVzLWZpbHRlci1yZW1vdmVXaGl0ZVwiXHJcbiAgICAgICAgICAgICAgICAgIHwgdHJhbnNsYXRlXHJcbiAgICAgICAgICAgICAgfX08L3NwYW4+XHJcbiAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2XHJcbiAgICAgICAgICBjbGFzcz1cInR1aS1pbWFnZS1lZGl0b3ItbmV3bGluZSB0dWktaW1hZ2UtZWRpdG9yLXJhbmdlLXdyYXAgc2hvcnQgdHVpLWltYWdlLWVkaXRvci1kLWZsZXggdHVpLWltYWdlLWVkaXRvci1mbGV4LXJvdyB0dWktaW1hZ2UtZWRpdG9yLWZsZXgtbm93cmFwIHR1aS1pbWFnZS1lZGl0b3ItYWxpZ24taXRlbXMtY2VudGVyXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8bGFiZWw+e3tcclxuICAgICAgICAgICAgXCJ0dWktaW1hZ2UtZWRpdG9yLWFuZ3VsYXItc3VibWVudXMtZmlsdGVyLXJlbW92ZVdoaXRlLWRpc3RhbmNlXCJcclxuICAgICAgICAgICAgICB8IHRyYW5zbGF0ZVxyXG4gICAgICAgICAgfX08L2xhYmVsPlxyXG4gICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgIHR5cGU9XCJyYW5nZVwiXHJcbiAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZmlsdGVyV2hpdGVSZW1vdmFsRGlzdGFuY2VcIlxyXG4gICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJmaWx0ZXJXaGl0ZVJlbW92YWxEaXN0YW5jZUNoYW5nZWQoJGV2ZW50LCB0cnVlKVwiXHJcbiAgICAgICAgICAgIChjaGFuZ2UpPVwiZmlsdGVyV2hpdGVSZW1vdmFsRGlzdGFuY2VDaGFuZ2VkKCRldmVudCwgZmFsc2UpXCJcclxuICAgICAgICAgICAgbWluPVwiMFwiXHJcbiAgICAgICAgICAgIG1heD1cIjFcIlxyXG4gICAgICAgICAgICBzdGVwPVwiMC4wMDFcIlxyXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiZmlsdGVyV2hpdGVSZW1vdmFsQ2hlY2tlZCA9PSBmYWxzZVwiXHJcbiAgICAgICAgICAvPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cInR1aS1pbWFnZS1lZGl0b3ItY2hlY2tib3gtZ3JvdXAgdHVpLWltYWdlLWVkaXRvci1kaXNhYmxlZFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0dWktaW1hZ2UtZWRpdG9yLWNoZWNrYm94XCI+XHJcbiAgICAgICAgICA8bGFiZWxcclxuICAgICAgICAgICAgY2xhc3M9XCJ0dWktaW1hZ2UtZWRpdG9yLWQtZmxleCB0dWktaW1hZ2UtZWRpdG9yLWZsZXgtcm93IHR1aS1pbWFnZS1lZGl0b3ItYWxpZ24taXRlbXMtY2VudGVyIHR1aS1pbWFnZS1lZGl0b3ItZmxleC1ub3dyYXBcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxyXG4gICAgICAgICAgICAgIGNsYXNzPVwidGllLWJyaWdodG5lc3NcIlxyXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZmlsdGVyQnJpZ2h0bmVzc0NoZWNrZWRcIlxyXG4gICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImZpbHRlckJyaWdodG5lc3NDaGVja2VkQ2hhbmdlZCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPHNwYW4+e3tcclxuICAgICAgICAgICAgICBcInR1aS1pbWFnZS1lZGl0b3ItYW5ndWxhci1zdWJtZW51cy1maWx0ZXItYnJpZ2h0bmVzc1wiIHwgdHJhbnNsYXRlXHJcbiAgICAgICAgICAgIH19PC9zcGFuPlxyXG4gICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidHVpLWltYWdlLWVkaXRvci1yYW5nZS13cmFwIHNob3J0IHR1aS1pbWFnZS1lZGl0b3ItZC1mbGV4IHR1aS1pbWFnZS1lZGl0b3ItZmxleC1yb3cgYWxpZ24taXRlbXMtY2VudGVyIHR1aS1pbWFnZS1lZGl0b3ItbXktMlwiPlxyXG4gICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgIHR5cGU9XCJyYW5nZVwiXHJcbiAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZmlsdGVyQnJpZ2h0bmVzc1ZhbHVlXCJcclxuICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiZmlsdGVyQnJpZ2h0bmVzc1ZhbHVlQ2hhbmdlZCgkZXZlbnQsIHRydWUpXCJcclxuICAgICAgICAgICAgKGNoYW5nZSk9XCJmaWx0ZXJCcmlnaHRuZXNzVmFsdWVDaGFuZ2VkKCRldmVudCwgZmFsc2UpXCJcclxuICAgICAgICAgICAgbWluPVwiLTFcIlxyXG4gICAgICAgICAgICBtYXg9XCIxXCJcclxuICAgICAgICAgICAgc3RlcD1cIjAuMDNcIlxyXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiZmlsdGVyQnJpZ2h0bmVzc0NoZWNrZWQgPT0gZmFsc2VcIlxyXG4gICAgICAgICAgLz5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJ0dWktaW1hZ2UtZWRpdG9yLWNoZWNrYm94LWdyb3VwIHR1aS1pbWFnZS1lZGl0b3ItZGlzYWJsZWRcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidHVpLWltYWdlLWVkaXRvci1jaGVja2JveFwiPlxyXG4gICAgICAgICAgPGxhYmVsXHJcbiAgICAgICAgICAgIGNsYXNzPVwidHVpLWltYWdlLWVkaXRvci1kLWZsZXggdHVpLWltYWdlLWVkaXRvci1mbGV4LXJvdyB0dWktaW1hZ2UtZWRpdG9yLWFsaWduLWl0ZW1zLWNlbnRlciB0dWktaW1hZ2UtZWRpdG9yLWZsZXgtbm93cmFwXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcclxuICAgICAgICAgICAgICBjbGFzcz1cInRpZS1ub2lzZVwiXHJcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJmaWx0ZXJOb2lzZUNoZWNrZWRcIlxyXG4gICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImZpbHRlck5vaXNlQ2hlY2tlZENoYW5nZWQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgIDxzcGFuPnt7XHJcbiAgICAgICAgICAgICAgXCJ0dWktaW1hZ2UtZWRpdG9yLWFuZ3VsYXItc3VibWVudXMtZmlsdGVyLW5vaXNlXCIgfCB0cmFuc2xhdGVcclxuICAgICAgICAgICAgfX08L3NwYW4+XHJcbiAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0dWktaW1hZ2UtZWRpdG9yLXJhbmdlLXdyYXAgc2hvcnQgdHVpLWltYWdlLWVkaXRvci1kLWZsZXggdHVpLWltYWdlLWVkaXRvci1mbGV4LXJvdyBhbGlnbi1pdGVtcy1jZW50ZXIgdHVpLWltYWdlLWVkaXRvci1teS0yXCI+XHJcbiAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgdHlwZT1cInJhbmdlXCJcclxuICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJmaWx0ZXJOb2lzZVZhbHVlXCJcclxuICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiZmlsdGVyTm9pc2VWYWx1ZUNoYW5nZWQoJGV2ZW50LCB0cnVlKVwiXHJcbiAgICAgICAgICAgIChjaGFuZ2UpPVwiZmlsdGVyTm9pc2VWYWx1ZUNoYW5nZWQoJGV2ZW50LCBmYWxzZSlcIlxyXG4gICAgICAgICAgICBtaW49XCIwXCJcclxuICAgICAgICAgICAgbWF4PVwiMTAwMFwiXHJcbiAgICAgICAgICAgIHN0ZXA9XCIxMFwiXHJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJmaWx0ZXJOb2lzZUNoZWNrZWQgPT0gZmFsc2VcIlxyXG4gICAgICAgICAgLz5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJ0dWktaW1hZ2UtZWRpdG9yLXBhcnRpdGlvbiBvbmx5LWxlZnQtcmlnaHRcIj5cclxuICAgICAgPGRpdj48L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cInR1aS1pbWFnZS1lZGl0b3Itc3VibWVudS1hbGlnblwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwidHVpLWltYWdlLWVkaXRvci1jaGVja2JveC1ncm91cCB0dWktaW1hZ2UtZWRpdG9yLWRpc2FibGVkXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInR1aS1pbWFnZS1lZGl0b3ItY2hlY2tib3hcIj5cclxuICAgICAgICAgIDxsYWJlbFxyXG4gICAgICAgICAgICBjbGFzcz1cInR1aS1pbWFnZS1lZGl0b3ItZC1mbGV4IHR1aS1pbWFnZS1lZGl0b3ItZmxleC1yb3cgdHVpLWltYWdlLWVkaXRvci1hbGlnbi1pdGVtcy1jZW50ZXIgdHVpLWltYWdlLWVkaXRvci1mbGV4LW5vd3JhcFwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJ0aWUtcGl4ZWxhdGVcIlxyXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZmlsdGVyUGl4ZWxhdGVDaGVja2VkXCJcclxuICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJmaWx0ZXJQaXhlbGF0ZUNoZWNrZWRDaGFuZ2VkKCRldmVudClcIlxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICA8c3Bhbj57e1xyXG4gICAgICAgICAgICAgIFwidHVpLWltYWdlLWVkaXRvci1hbmd1bGFyLXN1Ym1lbnVzLWZpbHRlci1waXhlbGF0ZVwiIHwgdHJhbnNsYXRlXHJcbiAgICAgICAgICAgIH19PC9zcGFuPlxyXG4gICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidHVpLWltYWdlLWVkaXRvci1yYW5nZS13cmFwIHNob3J0IHR1aS1pbWFnZS1lZGl0b3ItZC1mbGV4IHR1aS1pbWFnZS1lZGl0b3ItZmxleC1yb3cgYWxpZ24taXRlbXMtY2VudGVyIHR1aS1pbWFnZS1lZGl0b3ItbXktMlwiPlxyXG4gICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgIHR5cGU9XCJyYW5nZVwiXHJcbiAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZmlsdGVyUGl4ZWxhdGVWYWx1ZVwiXHJcbiAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImZpbHRlclBpeGVsYXRlVmFsdWVDaGFuZ2VkKCRldmVudCwgdHJ1ZSlcIlxyXG4gICAgICAgICAgICAoY2hhbmdlKT1cImZpbHRlclBpeGVsYXRlVmFsdWVDaGFuZ2VkKCRldmVudCwgZmFsc2UpXCJcclxuICAgICAgICAgICAgbWluPVwiMlwiXHJcbiAgICAgICAgICAgIG1heD1cIjIwXCJcclxuICAgICAgICAgICAgc3RlcD1cIjFcIlxyXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiZmlsdGVyUGl4ZWxhdGVDaGVja2VkID09IGZhbHNlXCJcclxuICAgICAgICAgIC8+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwidHVpLWltYWdlLWVkaXRvci1jaGVja2JveC1ncm91cCB0dWktaW1hZ2UtZWRpdG9yLWRpc2FibGVkXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInR1aS1pbWFnZS1lZGl0b3ItbmV3bGluZSB0dWktaW1hZ2UtZWRpdG9yLWNoZWNrYm94LXdyYXBcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0dWktaW1hZ2UtZWRpdG9yLWNoZWNrYm94XCI+XHJcbiAgICAgICAgICAgIDxsYWJlbFxyXG4gICAgICAgICAgICAgIGNsYXNzPVwidHVpLWltYWdlLWVkaXRvci1kLWZsZXggdHVpLWltYWdlLWVkaXRvci1mbGV4LXJvdyB0dWktaW1hZ2UtZWRpdG9yLWFsaWduLWl0ZW1zLWNlbnRlciB0dWktaW1hZ2UtZWRpdG9yLWZsZXgtbm93cmFwXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwidGllLWNvbG9yLWZpbHRlclwiXHJcbiAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImZpbHRlckNvbG9yRmlsdGVyQ2hlY2tlZFwiXHJcbiAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJmaWx0ZXJDb2xvckZpbHRlckNoZWNrZWRDaGFuZ2VkKCRldmVudClcIlxyXG4gICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgPHNwYW4+e3tcclxuICAgICAgICAgICAgICAgIFwidHVpLWltYWdlLWVkaXRvci1hbmd1bGFyLXN1Ym1lbnVzLWZpbHRlci1jb2xvckZpbHRlclwiXHJcbiAgICAgICAgICAgICAgICAgIHwgdHJhbnNsYXRlXHJcbiAgICAgICAgICAgICAgfX08L3NwYW4+XHJcbiAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidHVpLWltYWdlLWVkaXRvci1uZXdsaW5lIHR1aS1pbWFnZS1lZGl0b3ItcmFuZ2Utd3JhcCBzaG9ydFwiPlxyXG4gICAgICAgICAgPGxhYmVsPnt7XHJcbiAgICAgICAgICAgIFwidHVpLWltYWdlLWVkaXRvci1hbmd1bGFyLXN1Ym1lbnVzLWZpbHRlci1jb2xvckZpbHRlci10aHJlc2hvbGRcIlxyXG4gICAgICAgICAgICAgIHwgdHJhbnNsYXRlXHJcbiAgICAgICAgICB9fTwvbGFiZWw+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGllLWNvbG9yZmlsdGVyLXRocmVzaG9sZC1yYW5nZSB0dWktaW1hZ2UtZWRpdG9yLXJhbmdlIHR1aS1pbWFnZS1lZGl0b3ItZC1mbGV4IHR1aS1pbWFnZS1lZGl0b3ItZmxleC1yb3cgYWxpZ24taXRlbXMtY2VudGVyIHR1aS1pbWFnZS1lZGl0b3ItbXktMlwiPlxyXG4gICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICB0eXBlPVwicmFuZ2VcIlxyXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZmlsdGVyQ29sb3JGaWx0ZXJUaHJlc2hvbGRcIlxyXG4gICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImZpbHRlckNvbG9yRmlsdGVyVGhyZXNob2xkQ2hhbmdlZCgkZXZlbnQsIHRydWUpXCJcclxuICAgICAgICAgICAgICAoY2hhbmdlKT1cImZpbHRlckNvbG9yRmlsdGVyVGhyZXNob2xkQ2hhbmdlZCgkZXZlbnQsIGZhbHNlKVwiXHJcbiAgICAgICAgICAgICAgbWluPVwiMFwiXHJcbiAgICAgICAgICAgICAgbWF4PVwiMVwiXHJcbiAgICAgICAgICAgICAgc3RlcD1cIjAuMDJcIlxyXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJmaWx0ZXJDb2xvckZpbHRlckNoZWNrZWQgPT0gZmFsc2VcIlxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwidHVpLWltYWdlLWVkaXRvci1wYXJ0aXRpb25cIj5cclxuICAgICAgPGRpdj48L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdlxyXG4gICAgICBjbGFzcz1cInR1aS1pbWFnZS1lZGl0b3ItZC1mbGV4IHR1aS1pbWFnZS1lZGl0b3ItZmxleC1yb3cgdHVpLWltYWdlLWVkaXRvci1hbGlnbi1pdGVtcy1jZW50ZXJcIlxyXG4gICAgPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZmlsdGVyLWNvbG9yLWl0ZW1cIj5cclxuICAgICAgICA8ZGl2XHJcbiAgICAgICAgICBbY2xhc3NdPVwiXHJcbiAgICAgICAgICAgICd0aWUtZmlsdGVyLXRpbnQtY29sb3IgdHVpLWltYWdlLWVkaXRvci1idXR0b24gdHVpLWltYWdlLWVkaXRvci1idXR0b24tY29sb3ItcGlja2VyIHR1aS1pbWFnZS1lZGl0b3ItZC1mbGV4IHR1aS1pbWFnZS1lZGl0b3ItZmxleC1jb2x1bW4gdHVpLWltYWdlLWVkaXRvci1hbGlnbi1pdGVtcy1jZW50ZXIgJyArXHJcbiAgICAgICAgICAgIChmaWx0ZXJUaW50Q2hlY2tlZCA/ICdhY3RpdmUnIDogJycpXHJcbiAgICAgICAgICBcIlxyXG4gICAgICAgICAgW3RpdGxlXT1cIid0dWktaW1hZ2UtZWRpdG9yLWFuZ3VsYXItc3VibWVudXMtZmlsdGVyLXRpbnQnIHwgdHJhbnNsYXRlXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgcmVhZG9ubHlcclxuICAgICAgICAgICAgY2xhc3M9XCJ0aWUtZmlsdGVyLXRpbnQtY29sb3ItcGlja2VyIHR1aS1pbWFnZS1lZGl0b3ItbWItMlwiXHJcbiAgICAgICAgICAgIFsoY29sb3JQaWNrZXIpXT1cImZpbHRlclRpbnRDb2xvclwiXHJcbiAgICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kXT1cImZpbHRlclRpbnRDb2xvclwiXHJcbiAgICAgICAgICAgIFtjcE91dHB1dEZvcm1hdF09XCIncmdiYSdcIlxyXG4gICAgICAgICAgICBbY3BQcmVzZXRDb2xvcnNdPVwiZGVmYXVsdEZpbHRlclRpbnRDb2xvcnNcIlxyXG4gICAgICAgICAgICAoY29sb3JQaWNrZXJDaGFuZ2UpPVwiZmlsdGVyVGludENvbG9yQ2hhbmdlZCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgW2NwVXNlUm9vdFZpZXdDb250YWluZXJdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAvPlxyXG4gICAgICAgICAgPGxhYmVsXHJcbiAgICAgICAgICAgIGNsYXNzPVwidHVpLWltYWdlLWVkaXRvci1kLWZsZXggdHVpLWltYWdlLWVkaXRvci1mbGV4LXJvdyB0dWktaW1hZ2UtZWRpdG9yLWFsaWduLWl0ZW1zLWNlbnRlciB0dWktaW1hZ2UtZWRpdG9yLWZsZXgtbm93cmFwXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcclxuICAgICAgICAgICAgICBjbGFzcz1cInRpZS10aW50XCJcclxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImZpbHRlclRpbnRDaGVja2VkXCJcclxuICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJmaWx0ZXJUaW50Q2hlY2tlZENoYW5nZWQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgIDxzcGFuPnt7XHJcbiAgICAgICAgICAgICAgXCJ0dWktaW1hZ2UtZWRpdG9yLWFuZ3VsYXItc3VibWVudXMtZmlsdGVyLXRpbnRcIiB8IHRyYW5zbGF0ZVxyXG4gICAgICAgICAgICB9fTwvc3Bhbj5cclxuICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZmlsdGVyLWNvbG9yLWl0ZW1cIj5cclxuICAgICAgICA8ZGl2XHJcbiAgICAgICAgICBbY2xhc3NdPVwiXHJcbiAgICAgICAgICAgICd0aWUtZmlsdGVyLW11bHRpcGx5LWNvbG9yIHR1aS1pbWFnZS1lZGl0b3ItYnV0dG9uIHR1aS1pbWFnZS1lZGl0b3ItYnV0dG9uLWNvbG9yLXBpY2tlciB0dWktaW1hZ2UtZWRpdG9yLWQtZmxleCB0dWktaW1hZ2UtZWRpdG9yLWZsZXgtY29sdW1uIHR1aS1pbWFnZS1lZGl0b3ItYWxpZ24taXRlbXMtY2VudGVyICcgK1xyXG4gICAgICAgICAgICAoZmlsdGVyTXVsdGlwbHlDaGVja2VkID8gJ2FjdGl2ZScgOiAnJylcclxuICAgICAgICAgIFwiXHJcbiAgICAgICAgICBbdGl0bGVdPVwiXHJcbiAgICAgICAgICAgICd0dWktaW1hZ2UtZWRpdG9yLWFuZ3VsYXItc3VibWVudXMtZmlsdGVyLW11bHRpcGx5JyB8IHRyYW5zbGF0ZVxyXG4gICAgICAgICAgXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgcmVhZG9ubHlcclxuICAgICAgICAgICAgY2xhc3M9XCJ0aWUtZmlsdGVyLW11bHRpcGx5LWNvbG9yLXBpY2tlciB0dWktaW1hZ2UtZWRpdG9yLW1iLTJcIlxyXG4gICAgICAgICAgICBbKGNvbG9yUGlja2VyKV09XCJmaWx0ZXJNdWx0aXBseUNvbG9yXCJcclxuICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmRdPVwiZmlsdGVyTXVsdGlwbHlDb2xvclwiXHJcbiAgICAgICAgICAgIFtjcE91dHB1dEZvcm1hdF09XCInaGV4J1wiXHJcbiAgICAgICAgICAgIFtjcFByZXNldENvbG9yc109XCJkZWZhdWx0RmlsdGVyTXVsdGlwbHlDb2xvcnNcIlxyXG4gICAgICAgICAgICAoY29sb3JQaWNrZXJDaGFuZ2UpPVwiZmlsdGVyTXVsdGlwbHlDb2xvckNoYW5nZWQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIFtjcFVzZVJvb3RWaWV3Q29udGFpbmVyXT1cInRydWVcIlxyXG4gICAgICAgICAgLz5cclxuICAgICAgICAgIDxsYWJlbFxyXG4gICAgICAgICAgICBjbGFzcz1cInR1aS1pbWFnZS1lZGl0b3ItZC1mbGV4IHR1aS1pbWFnZS1lZGl0b3ItZmxleC1yb3cgdHVpLWltYWdlLWVkaXRvci1hbGlnbi1pdGVtcy1jZW50ZXIgdHVpLWltYWdlLWVkaXRvci1mbGV4LW5vd3JhcFwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJ0aWUtbXVsdGlwbHlcIlxyXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZmlsdGVyTXVsdGlwbHlDaGVja2VkXCJcclxuICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJmaWx0ZXJNdWx0aXBseUNoZWNrZWRDaGFuZ2VkKCRldmVudClcIlxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICA8c3Bhbj57e1xyXG4gICAgICAgICAgICAgIFwidHVpLWltYWdlLWVkaXRvci1hbmd1bGFyLXN1Ym1lbnVzLWZpbHRlci1tdWx0aXBseVwiIHwgdHJhbnNsYXRlXHJcbiAgICAgICAgICAgIH19PC9zcGFuPlxyXG4gICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJmaWx0ZXItY29sb3ItaXRlbVwiPlxyXG4gICAgICAgIDxkaXZcclxuICAgICAgICAgIFtjbGFzc109XCJcclxuICAgICAgICAgICAgJ3RpZS1maWx0ZXItYmxlbmQtY29sb3IgdHVpLWltYWdlLWVkaXRvci1idXR0b24gdHVpLWltYWdlLWVkaXRvci1idXR0b24tY29sb3ItcGlja2VyIHR1aS1pbWFnZS1lZGl0b3ItZC1mbGV4IHR1aS1pbWFnZS1lZGl0b3ItZmxleC1jb2x1bW4gdHVpLWltYWdlLWVkaXRvci1hbGlnbi1pdGVtcy1jZW50ZXIgJyArXHJcbiAgICAgICAgICAgIChmaWx0ZXJCbGVuZENoZWNrZWQgPyAnYWN0aXZlJyA6ICcnKVxyXG4gICAgICAgICAgXCJcclxuICAgICAgICAgIFt0aXRsZV09XCIndHVpLWltYWdlLWVkaXRvci1hbmd1bGFyLXN1Ym1lbnVzLWZpbHRlci1ibGVuZCcgfCB0cmFuc2xhdGVcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICByZWFkb25seVxyXG4gICAgICAgICAgICBjbGFzcz1cInRpZS1maWx0ZXItYmxlbmQtY29sb3ItcGlja2VyIHR1aS1pbWFnZS1lZGl0b3ItbWItMlwiXHJcbiAgICAgICAgICAgIFsoY29sb3JQaWNrZXIpXT1cImZpbHRlckJsZW5kQ29sb3JcIlxyXG4gICAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZF09XCJmaWx0ZXJCbGVuZENvbG9yXCJcclxuICAgICAgICAgICAgW2NwT3V0cHV0Rm9ybWF0XT1cIidyZ2JhJ1wiXHJcbiAgICAgICAgICAgIFtjcFByZXNldENvbG9yc109XCJkZWZhdWx0RmlsdGVyQmxlbmRDb2xvcnNcIlxyXG4gICAgICAgICAgICAoY29sb3JQaWNrZXJDaGFuZ2UpPVwiZmlsdGVyQmxlbmRDb2xvckNoYW5nZWQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIFtjcFVzZVJvb3RWaWV3Q29udGFpbmVyXT1cInRydWVcIlxyXG4gICAgICAgICAgLz5cclxuICAgICAgICAgIDxsYWJlbFxyXG4gICAgICAgICAgICBjbGFzcz1cInR1aS1pbWFnZS1lZGl0b3ItZC1mbGV4IHR1aS1pbWFnZS1lZGl0b3ItZmxleC1yb3cgdHVpLWltYWdlLWVkaXRvci1hbGlnbi1pdGVtcy1jZW50ZXIgdHVpLWltYWdlLWVkaXRvci1mbGV4LW5vd3JhcFwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJ0aWUtYmxlbmRcIlxyXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZmlsdGVyQmxlbmRDaGVja2VkXCJcclxuICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJmaWx0ZXJCbGVuZENoZWNrZWRDaGFuZ2VkKCRldmVudClcIlxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICA8c3Bhbj57e1xyXG4gICAgICAgICAgICAgIFwidHVpLWltYWdlLWVkaXRvci1hbmd1bGFyLXN1Ym1lbnVzLWZpbHRlci1ibGVuZFwiIHwgdHJhbnNsYXRlXHJcbiAgICAgICAgICAgIH19PC9zcGFuPlxyXG4gICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcbiJdfQ==
|