@valtimo/process 4.15.3-next-main.16 → 4.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,256 +1,256 @@
1
- /*
2
- * Copyright 2015-2020 Ritense BV, the Netherlands.
3
- *
4
- * Licensed under EUPL, Version 1.2 (the "License");
5
- * you may not use this file except in compliance with the License.
6
- * You may obtain a copy of the License at
7
- *
8
- * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
9
- *
10
- * Unless required by applicable law or agreed to in writing, software
11
- * distributed under the License is distributed on an "AS IS" basis,
12
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
- * See the License for the specific language governing permissions and
14
- * limitations under the License.
15
- */
16
- import { Component, ElementRef, EventEmitter, Input, Output, ViewChild, ViewEncapsulation, } from '@angular/core';
17
- import { ProcessService } from '../process.service';
18
- import * as BpmnJS from 'bpmn-js/dist/bpmn-navigated-viewer.production.min.js';
19
- import * as heatmap from 'heatmap.js-fixed/build/heatmap.js';
20
- export class ProcessDiagramComponent {
21
- constructor(processService) {
22
- this.processService = processService;
23
- this.importDone = new EventEmitter();
24
- this.enumHeatmapOptions = ['count', 'duration'];
25
- }
26
- ngOnInit() {
27
- if (this.processDefinitionKey) {
28
- this.loadProcessDefinitionFromKey(this.processDefinitionKey);
29
- }
30
- if (this.processInstanceId) {
31
- this.loadProcessInstanceXml(this.processInstanceId);
32
- }
33
- this.bpmnJS = new BpmnJS();
34
- this.bpmnJS.on('import.done', ({ error }) => {
35
- if (!error) {
36
- const canvas = this.bpmnJS.get('canvas'), eventBus = this.bpmnJS.get('eventBus');
37
- if (this.processDiagram.historicActivityInstances) {
38
- this.processDiagram.historicActivityInstances.forEach(instance => {
39
- // exclude multiInstanceBody
40
- if (instance.activityType !== 'multiInstanceBody') {
41
- canvas.addMarker(instance.activityId, instance.endTime ? 'highlight-overlay-past' : 'highlight-overlay-current');
42
- }
43
- });
44
- }
45
- canvas.zoom('fit-viewport', 'auto');
46
- if (this.processDefinitionVersions) {
47
- eventBus.on('canvas.init', () => {
48
- if (this.showHeatmap) {
49
- this.clearHeatmap();
50
- }
51
- this.loadHeatmapData();
52
- });
53
- eventBus.on('canvas.viewbox.changing', () => {
54
- if (this.showHeatmap) {
55
- this.clearHeatmap();
56
- }
57
- });
58
- eventBus.on('canvas.viewbox.changed', () => {
59
- this.loadHeatmapData();
60
- });
61
- }
62
- }
63
- });
64
- }
65
- ngOnChanges() {
66
- if (this.processDefinitionKey) {
67
- this.loadProcessDefinitionFromKey(this.processDefinitionKey);
68
- }
69
- else if (this.processInstanceId) {
70
- this.loadProcessInstanceXml(this.processInstanceId);
71
- }
72
- }
73
- ngOnDestroy() {
74
- if (this.bpmnJS) {
75
- this.bpmnJS.destroy();
76
- }
77
- }
78
- loadProcessDefinition(processDefinitionKey) {
79
- this.processService.getProcessDefinition(processDefinitionKey).subscribe(response => {
80
- this.heatmapOption = this.enumHeatmapOptions[0];
81
- this.version = response.version;
82
- this.loadProcessDefinitionXml(response.id);
83
- });
84
- }
85
- loadProcessDefinitionVersions(processDefinitionKey) {
86
- this.processService.getProcessDefinitionVersions(processDefinitionKey).subscribe(response => {
87
- this.processDefinitionVersions = response;
88
- });
89
- }
90
- loadProcessDefinitionFromKey(processDefinitionKey) {
91
- this.loadProcessDefinitionVersions(processDefinitionKey);
92
- this.loadProcessDefinition(processDefinitionKey);
93
- }
94
- loadProcessDefinitionXml(processDefinitionId) {
95
- this.processService.getProcessDefinitionXml(processDefinitionId).subscribe(response => {
96
- this.processDiagram = response;
97
- this.bpmnJS.importXML(this.processDiagram.bpmn20Xml);
98
- this.bpmnJS.attachTo(this.el.nativeElement);
99
- });
100
- }
101
- loadProcessInstanceXml(processInstanceId) {
102
- this.processService.getProcessXml(processInstanceId).subscribe(response => {
103
- this.processDiagram = response;
104
- this.bpmnJS.importXML(this.processDiagram.bpmn20Xml);
105
- this.bpmnJS.attachTo(this.el.nativeElement);
106
- });
107
- }
108
- loadProcessDefinitionHeatmapCount(processDefinition) {
109
- this.processService.getProcessHeatmapCount(processDefinition).subscribe(response => {
110
- this.inputData = response;
111
- this.valueKey = 'totalCount';
112
- this.heatPoints = { data: [] };
113
- this.min = 0;
114
- this.max = 0;
115
- Object.keys(this.inputData).forEach(key => {
116
- const diagramContainer = this.el.nativeElement.querySelector('svg').getBoundingClientRect(), diagramElm = this.el.nativeElement
117
- .querySelector(`g[data-element-id=${key}]`)
118
- .getBoundingClientRect();
119
- this.setMax(key);
120
- this.heatPoints.data.push({
121
- x: Math.round(diagramElm.x - diagramContainer.x + diagramElm.width / 2),
122
- y: Math.round(diagramElm.y - diagramContainer.y + diagramElm.height / 2),
123
- value: this.inputData[key][this.valueKey],
124
- radius: diagramElm.width / 2,
125
- });
126
- this.addCounterActiveOverlays(key, this.inputData);
127
- });
128
- this.clearHeatmap();
129
- if (this.showHeatmap) {
130
- this.loadHeatmap();
131
- }
132
- });
133
- }
134
- onWindowResize() {
135
- const oldCanvas = this.el.nativeElement.querySelector('canvas[class=heatmap-canvas]');
136
- if (oldCanvas) {
137
- oldCanvas.remove();
138
- this.heatMapInstance = null;
139
- }
140
- if (this.showHeatmap) {
141
- this.loadHeatmap();
142
- }
143
- }
144
- loadProcessDefinitionHeatmapDuration(processDefinition) {
145
- this.processService.getProcessHeatmapDuration(processDefinition).subscribe(response => {
146
- this.inputData = response;
147
- this.valueKey = 'averageDurationInMilliseconds';
148
- this.heatPoints = { data: [] };
149
- this.min = 0;
150
- this.max = 0;
151
- Object.keys(this.inputData).forEach(key => {
152
- const diagramContainer = this.el.nativeElement.querySelector('svg').getBoundingClientRect(), diagramElm = this.el.nativeElement
153
- .querySelector(`g[data-element-id=${key}]`)
154
- .getBoundingClientRect();
155
- this.setMax(key);
156
- this.heatPoints.data.push({
157
- x: Math.round(diagramElm.x - diagramContainer.x + diagramElm.width / 2),
158
- y: Math.round(diagramElm.y - diagramContainer.y + diagramElm.height / 2),
159
- value: this.inputData[key][this.valueKey],
160
- radius: diagramElm.width / 2,
161
- });
162
- this.addCounterActiveOverlays(key, this.inputData);
163
- });
164
- this.clearHeatmap();
165
- if (this.showHeatmap) {
166
- this.loadHeatmap();
167
- }
168
- });
169
- }
170
- setProcessDefinitionKey(processDefinitionKey) {
171
- this.processDefinitionKey = processDefinitionKey;
172
- this.loadProcessDefinitionFromKey(this.processDefinitionKey);
173
- }
174
- setProcessDefinitionVersion(version) {
175
- this.version = +version;
176
- this.loadHeatmapData();
177
- }
178
- setHeatmapOption(heatmapOption) {
179
- this.heatmapOption = heatmapOption;
180
- this.loadHeatmapData();
181
- }
182
- toggleShowHeatmap() {
183
- this.showHeatmap = !this.showHeatmap;
184
- this.loadHeatmapData();
185
- }
186
- loadHeatmap() {
187
- if (!this.heatMapInstance) {
188
- this.heatMapInstance = heatmap.create({
189
- radius: 54,
190
- blur: 0.7,
191
- maxOpacity: 0.4,
192
- minOpacity: 0,
193
- container: this.el.nativeElement,
194
- });
195
- }
196
- this.heatMapInstance.setData({
197
- min: this.min,
198
- max: this.max,
199
- data: this.heatPoints.data,
200
- });
201
- }
202
- clearHeatmap() {
203
- if (this.heatMapInstance) {
204
- this.heatMapInstance.setData({ data: [] });
205
- }
206
- }
207
- loadHeatmapData() {
208
- this.processDefinition = this.processDefinitionVersions.find(definition => definition.version === this.version);
209
- if (this.heatmapOption === 'count') {
210
- this.loadProcessDefinitionHeatmapCount(this.processDefinition);
211
- }
212
- if (this.heatmapOption === 'duration') {
213
- this.loadProcessDefinitionHeatmapDuration(this.processDefinition);
214
- }
215
- }
216
- setMax(key) {
217
- if (this.heatmapDuration) {
218
- this.max = Math.max(this.heatmapDuration[key].averageDurationInMilliseconds, this.max);
219
- }
220
- else if (this.heatmapCount) {
221
- this.max = Math.max(this.heatmapCount[key].totalCount + this.heatmapCount[key].count, this.max);
222
- }
223
- }
224
- addCounterActiveOverlays(key, inputData) {
225
- const overlays = this.bpmnJS.get('overlays');
226
- overlays.add(key, {
227
- position: {
228
- bottom: 13,
229
- left: -12,
230
- },
231
- show: {
232
- minZoom: 0,
233
- maxZoom: 5.0,
234
- },
235
- html: `<span class="badge badge-pill badge-primary">${inputData[key].count}</span>`,
236
- });
237
- }
238
- }
239
- ProcessDiagramComponent.decorators = [
240
- { type: Component, args: [{
241
- selector: 'valtimo-process-diagram',
242
- template: "<!--\n ~ Copyright 2015-2020 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n<div class=\"process-diagram-container\">\n <div *ngIf=\"processDefinitionKey\" class=\"diagram-container-switch-holder\">\n <div class=\"container-fluid\">\n <div class=\"row p-4 bg-light\">\n <div class=\"col-4\">\n <label><strong>Version</strong></label\n ><br />\n <select class=\"form-control\" (change)=\"setProcessDefinitionVersion($event.target.value)\">\n <option\n *ngFor=\"let processDefinitionVersion of processDefinitionVersions\"\n [value]=\"processDefinitionVersion.version\"\n [selected]=\"processDefinitionVersion.version === version\"\n >\n {{ processDefinitionVersion.version }}\n </option>\n </select>\n </div>\n <div class=\"col-4\">\n <label><strong>Heatmap type</strong></label\n ><br />\n <select class=\"form-control\" (change)=\"setHeatmapOption($event.target.value)\">\n <option\n *ngFor=\"let option of enumHeatmapOptions\"\n [value]=\"option\"\n [selected]=\"option === heatmapOption\"\n >\n {{ option }}\n </option>\n </select>\n </div>\n <div class=\"col-4 text-right\">\n <label><strong>Show heatmap</strong></label\n ><br />\n <div class=\"text-left switch-button switch-button-sm switch-button-success\">\n <input\n type=\"checkbox\"\n id=\"toggleHeatmap\"\n [checked]=\"showHeatmap\"\n (click)=\"toggleShowHeatmap()\"\n /><span> <label for=\"toggleHeatmap\"></label></span>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div #ref (window:resize)=\"onWindowResize()\" class=\"diagram-container\"></div>\n\n <div *ngIf=\"processInstanceId\" class=\"p-4 text-center legenda-holder\">\n <span\n ><div class=\"legenda highlight-overlay-past\"></div>\n Executed tasks</span\n >\n <span class=\"ml-3\"\n ><div class=\"legenda highlight-overlay-current\"></div>\n Current tasks</span\n >\n </div>\n\n <div *ngIf=\"processDefinitionKey\" class=\"p-4 text-center legenda-holder\">\n <span\n ><span class=\"badge badge-pill badge-primary\">N</span>&nbsp;&nbsp;Amount of currently active\n instances of this task.</span\n >\n <span\n >&nbsp;&nbsp;|&nbsp;&nbsp;Red/yellow/green orbs: The amount of times the task is executed in\n comparison to the other tasks.</span\n >\n </div>\n</div>\n",
243
- encapsulation: ViewEncapsulation.None,
244
- styles: [".process-diagram-container .diagram-container{height:50vh;width:100%}.process-diagram-container .diagram-container-switch-holder{position:absolute;width:100%;z-index:1000}.process-diagram-container .highlight-overlay-past:not(.djs-connection) .djs-visual>:first-child{fill:#d8d8d8!important}.process-diagram-container .highlight-overlay-current:not(.djs-connection) .djs-visual>:first-child{fill:#b2e0ff!important}.process-diagram-container .legenda-holder{font-size:1em}.process-diagram-container .legenda{border:2px solid #000;border-radius:3px;display:inline-block;margin-bottom:-4px;margin-right:5px;padding:7px}.process-diagram-container .legenda.highlight-overlay-past{background-color:#d8d8d8}.process-diagram-container .legenda.highlight-overlay-current{background-color:#b2e0ff}"]
245
- },] }
246
- ];
247
- ProcessDiagramComponent.ctorParameters = () => [
248
- { type: ProcessService }
249
- ];
250
- ProcessDiagramComponent.propDecorators = {
251
- el: [{ type: ViewChild, args: ['ref', { static: true },] }],
252
- importDone: [{ type: Output }],
253
- processDefinitionKey: [{ type: Input }],
254
- processInstanceId: [{ type: Input }]
255
- };
256
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvY2Vzcy1kaWFncmFtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJEOi9Xb3Jrc3BhY2UvdmFsdGltby92YWx0aW1vLWZyb250ZW5kLWxpYnJhcmllcy9wcm9qZWN0cy92YWx0aW1vL3Byb2Nlc3Mvc3JjLyIsInNvdXJjZXMiOlsibGliL3Byb2Nlc3MtZGlhZ3JhbS9wcm9jZXNzLWRpYWdyYW0uY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBRUgsT0FBTyxFQUNMLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLEtBQUssRUFJTCxNQUFNLEVBQ04sU0FBUyxFQUNULGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFFbEQsT0FBTyxLQUFLLE1BQU0sTUFBTSxzREFBc0QsQ0FBQztBQUMvRSxPQUFPLEtBQUssT0FBTyxNQUFNLG1DQUFtQyxDQUFDO0FBUTdELE1BQU0sT0FBTyx1QkFBdUI7SUF5QmxDLFlBQW9CLGNBQThCO1FBQTlCLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQXBCakMsZUFBVSxHQUFzQixJQUFJLFlBQVksRUFBRSxDQUFDO1FBVzdELHVCQUFrQixHQUFHLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBU0csQ0FBQztJQUV0RCxRQUFRO1FBQ04sSUFBSSxJQUFJLENBQUMsb0JBQW9CLEVBQUU7WUFDN0IsSUFBSSxDQUFDLDRCQUE0QixDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1NBQzlEO1FBQ0QsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUU7WUFDMUIsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1NBQ3JEO1FBQ0QsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQzNCLElBQUksQ0FBQyxN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SUFBSSxFQUFFO2dCQUNKLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE9BQU8sRUFBRSxHQUFHO2FBQ2I7WUFDRCxJQUFJLEVBQUUsZ0RBQWdELFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLFNBQVM7U0FDcEYsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7O1lBcFJGLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUseUJBQXlCO2dCQUNuQyw2ckdBQStDO2dCQUUvQyxhQUFhLEVBQUUsaUJBQWlCLENBQUMsSUFBSTs7YUFDdEM7OztZQVZPLGNBQWM7OztpQkFlbkIsU0FBUyxTQUFDLEtBQUssRUFBRSxFQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUM7eUJBQy9CLE1BQU07bUNBQ04sS0FBSztnQ0FDTCxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAyMDE1LTIwMjAgUml0ZW5zZSBCViwgdGhlIE5ldGhlcmxhbmRzLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIEVVUEwsIFZlcnNpb24gMS4yICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cHM6Ly9qb2ludXAuZWMuZXVyb3BhLmV1L2NvbGxlY3Rpb24vZXVwbC9ldXBsLXRleHQtZXVwbC0xMlxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBiYXNpcyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtQcm9jZXNzU2VydmljZX0gZnJvbSAnLi4vcHJvY2Vzcy5zZXJ2aWNlJztcblxuaW1wb3J0ICogYXMgQnBtbkpTIGZyb20gJ2JwbW4tanMvZGlzdC9icG1uLW5hdmlnYXRlZC12aWV3ZXIucHJvZHVjdGlvbi5taW4uanMnO1xuaW1wb3J0ICogYXMgaGVhdG1hcCBmcm9tICdoZWF0bWFwLmpzLWZpeGVkL2J1aWxkL2hlYXRtYXAuanMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd2YWx0aW1vLXByb2Nlc3MtZGlhZ3JhbScsXG4gIHRlbXBsYXRlVXJsOiAnLi9wcm9jZXNzLWRpYWdyYW0uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9wcm9jZXNzLWRpYWdyYW0uY29tcG9uZW50LnNjc3MnXSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbn0pXG5leHBvcnQgY2xhc3MgUHJvY2Vzc0RpYWdyYW1Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgT25DaGFuZ2VzIHtcbiAgcHJpdmF0ZSBicG1uSlM6IEJwbW5KUztcbiAgcHJpdmF0ZSBoZWF0TWFwSW5zdGFuY2U6IGFueTtcblxuICBAVmlld0NoaWxkKCdyZWYnLCB7c3RhdGljOiB0cnVlfSkgcHVibGljIGVsOiBFbGVtZW50UmVmO1xuICBAT3V0cHV0KCkgcHVibGljIGltcG9ydERvbmU6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBASW5wdXQoKSBwdWJsaWMgcHJvY2Vzc0RlZmluaXRpb25LZXk/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIHB1YmxpYyBwcm9jZXNzSW5zdGFuY2VJZD86IHN0cmluZztcblxuICBwdWJsaWMgcHJvY2Vzc0RpYWdyYW06IGFueTtcbiAgcHVibGljIHByb2Nlc3NEZWZpbml0aW9uOiBhbnk7XG4gIHB1YmxpYyBwcm9jZXNzRGVmaW5pdGlvblZlcnNpb25zOiBhbnk7XG4gIHB1YmxpYyBoZWF0bWFwQ291bnQ6IGFueTtcbiAgcHVibGljIGhlYXRtYXBEdXJhdGlvbjogYW55O1xuICBwdWJsaWMgdGFza3NDb3VudDogYW55O1xuICBwdWJsaWMgc2hvd0hlYXRtYXA6IGJvb2xlYW47XG4gIHB1YmxpYyBlbnVtSGVhdG1hcE9wdGlvbnMgPSBbJ2NvdW50JywgJ2R1cmF0aW9uJ107XG4gIHB1YmxpYyBoZWF0bWFwT3B0aW9uOiBzdHJpbmc7XG4gIHB1YmxpYyB2ZXJzaW9uOiBhbnk7XG4gIHB1YmxpYyBoZWF0UG9pbnRzOiBhbnk7XG4gIHB1YmxpYyBtaW46IG51bWJlcjtcbiAgcHVibGljIG1heDogbnVtYmVyO1xuICBwdWJsaWMgaW5wdXREYXRhOiBhbnk7XG4gIHB1YmxpYyB2YWx1ZUtleTogYW55O1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcHJvY2Vzc1NlcnZpY2U6IFByb2Nlc3NTZXJ2aWNlKSB7fVxuXG4gIG5nT25Jbml0KCkge1xuICAgIGlmICh0aGlzLnByb2Nlc3NEZWZpbml0aW9uS2V5KSB7XG4gICAgICB0aGlzLmxvYWRQcm9jZXNzRGVmaW5pdGlvbkZyb21LZXkodGhpcy5wcm9jZXNzRGVmaW5pdGlvbktleSk7XG4gICAgfVxuICAgIGlmICh0aGlzLnByb2Nlc3NJbnN0YW5jZUlkKSB7XG4gICAgICB0aGlzLmxvYWRQcm9jZXNzSW5zdGFuY2VYbWwodGhpcy5wcm9jZXNzSW5zdGFuY2VJZCk7XG4gICAgfVxuICAgIHRoaXMuYnBtbkpTID0gbmV3IEJwbW5KUygpO1xuICAgIHRoaXMuYnBtbkpTLm9uKCdpbXBvcnQuZG9uZScsICh7ZXJyb3J9KSA9PiB7XG4gICAgICBpZiAoIWVycm9yKSB7XG4gICAgICAgIGNvbnN0IGNhbnZhcyA9IHRoaXMuYnBtbkpTLmdldCgnY2FudmFzJyksXG4gICAgICAgICAgZXZlbnRCdXMgPSB0aGlzLmJwbW5KUy5nZXQoJ2V2ZW50QnVzJyk7XG4gICAgICAgIGlmICh0aGlzLnByb2Nlc3NEaWFncmFtLmhpc3RvcmljQWN0aXZpdHlJbnN0YW5jZXMpIHtcbiAgICAgICAgICB0aGlzLnByb2Nlc3NEaWFncmFtLmhpc3RvcmljQWN0aXZpdHlJbnN0YW5jZXMuZm9yRWFjaChpbnN0YW5jZSA9PiB7XG4gICAgICAgICAgICAvLyBleGNsdWRlIG11bHRpSW5zdGFuY2VCb2R5XG4gICAgICAgICAgICBpZiAoaW5zdGFuY2UuYWN0aXZpdHlUeXBlICE9PSAnbXVsdGlJbnN0YW5jZUJvZHknKSB7XG4gICAgICAgICAgICAgIGNhbnZhcy5hZGRNYXJrZXIoXG4gICAgICAgICAgICAgICAgaW5zdGFuY2UuYWN0aXZpdHlJZCxcbiAgICAgICAgICAgICAgICBpbnN0YW5jZS5lbmRUaW1lID8gJ2hpZ2hsaWdodC1vdmVybGF5LXBhc3QnIDogJ2hpZ2hsaWdodC1vdmVybGF5LWN1cnJlbnQnXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjYW52YXMuem9vbSgnZml0LXZpZXdwb3J0JywgJ2F1dG8nKTtcbiAgICAgICAgaWYgKHRoaXMucHJvY2Vzc0RlZmluaXRpb25WZXJzaW9ucykge1xuICAgICAgICAgIGV2ZW50QnVzLm9uKCdjYW52YXMuaW5pdCcsICgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLnNob3dIZWF0bWFwKSB7XG4gICAgICAgICAgICAgIHRoaXMuY2xlYXJIZWF0bWFwKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmxvYWRIZWF0bWFwRGF0YSgpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGV2ZW50QnVzLm9uKCdjYW52YXMudmlld2JveC5jaGFuZ2luZycsICgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLnNob3dIZWF0bWFwKSB7XG4gICAgICAgICAgICAgIHRoaXMuY2xlYXJIZWF0bWFwKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgZXZlbnRCdXMub24oJ2NhbnZhcy52aWV3Ym94LmNoYW5nZWQnLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmxvYWRIZWF0bWFwRGF0YSgpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wcm9jZXNzRGVmaW5pdGlvbktleSkge1xuICAgICAgdGhpcy5sb2FkUHJvY2Vzc0RlZmluaXRpb25Gcm9tS2V5KHRoaXMucHJvY2Vzc0RlZmluaXRpb25LZXkpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5wcm9jZXNzSW5zdGFuY2VJZCkge1xuICAgICAgdGhpcy5sb2FkUHJvY2Vzc0luc3RhbmNlWG1sKHRoaXMucHJvY2Vzc0luc3RhbmNlSWQpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIGlmICh0aGlzLmJwbW5KUykge1xuICAgICAgdGhpcy5icG1uSlMuZGVzdHJveSgpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBsb2FkUHJvY2Vzc0RlZmluaXRpb24ocHJvY2Vzc0RlZmluaXRpb25LZXkpIHtcbiAgICB0aGlzLnByb2Nlc3NTZXJ2aWNlLmdldFByb2Nlc3NEZWZpbml0aW9uKHByb2Nlc3NEZWZpbml0aW9uS2V5KS5zdWJzY3JpYmUocmVzcG9uc2UgPT4ge1xuICAgICAgdGhpcy5oZWF0bWFwT3B0aW9uID0gdGhpcy5lbnVtSGVhdG1hcE9wdGlvbnNbMF07XG4gICAgICB0aGlzLnZlcnNpb24gPSByZXNwb25zZS52ZXJzaW9uO1xuICAgICAgdGhpcy5sb2FkUHJvY2Vzc0RlZmluaXRpb25YbWwocmVzcG9uc2UuaWQpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGxvYWRQcm9jZXNzRGVmaW5pdGlvblZlcnNpb25zKHByb2Nlc3NEZWZpbml0aW9uS2V5KSB7XG4gICAgdGhpcy5wcm9jZXNzU2VydmljZS5nZXRQcm9jZXNzRGVmaW5pdGlvblZlcnNpb25zKHByb2Nlc3NEZWZpbml0aW9uS2V5KS5zdWJzY3JpYmUocmVzcG9uc2UgPT4ge1xuICAgICAgdGhpcy5wcm9jZXNzRGVmaW5pdGlvblZlcnNpb25zID0gcmVzcG9uc2U7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgbG9hZFByb2Nlc3NEZWZpbml0aW9uRnJvbUtleShwcm9jZXNzRGVmaW5pdGlvbktleSkge1xuICAgIHRoaXMubG9hZFByb2Nlc3NEZWZpbml0aW9uVmVyc2lvbnMocHJvY2Vzc0RlZmluaXRpb25LZXkpO1xuICAgIHRoaXMubG9hZFByb2Nlc3NEZWZpbml0aW9uKHByb2Nlc3NEZWZpbml0aW9uS2V5KTtcbiAgfVxuXG4gIHB1YmxpYyBsb2FkUHJvY2Vzc0RlZmluaXRpb25YbWwocHJvY2Vzc0RlZmluaXRpb25JZCkge1xuICAgIHRoaXMucHJvY2Vzc1NlcnZpY2UuZ2V0UHJvY2Vzc0RlZmluaXRpb25YbWwocHJvY2Vzc0RlZmluaXRpb25JZCkuc3Vic2NyaWJlKHJlc3BvbnNlID0+IHtcbiAgICAgIHRoaXMucHJvY2Vzc0RpYWdyYW0gPSByZXNwb25zZTtcbiAgICAgIHRoaXMuYnBtbkpTLmltcG9ydFhNTCh0aGlzLnByb2Nlc3NEaWFncmFtLmJwbW4yMFhtbCk7XG4gICAgICB0aGlzLmJwbW5KUy5hdHRhY2hUbyh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2FkUHJvY2Vzc0luc3RhbmNlWG1sKHByb2Nlc3NJbnN0YW5jZUlkKSB7XG4gICAgdGhpcy5wcm9jZXNzU2VydmljZS5nZXRQcm9jZXNzWG1sKHByb2Nlc3NJbnN0YW5jZUlkKS5zdWJzY3JpYmUocmVzcG9uc2UgPT4ge1xuICAgICAgdGhpcy5wcm9jZXNzRGlhZ3JhbSA9IHJlc3BvbnNlO1xuICAgICAgdGhpcy5icG1uSlMuaW1wb3J0WE1MKHRoaXMucHJvY2Vzc0RpYWdyYW0uYnBtbjIwWG1sKTtcbiAgICAgIHRoaXMuYnBtbkpTLmF0dGFjaFRvKHRoaXMuZWwubmF0aXZlRWxlbWVudCk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgbG9hZFByb2Nlc3NEZWZpbml0aW9uSGVhdG1hcENvdW50KHByb2Nlc3NEZWZpbml0aW9uKSB7XG4gICAgdGhpcy5wcm9jZXNzU2VydmljZS5nZXRQcm9jZXNzSGVhdG1hcENvdW50KHByb2Nlc3NEZWZpbml0aW9uKS5zdWJzY3JpYmUocmVzcG9uc2UgPT4ge1xuICAgICAgdGhpcy5pbnB1dERhdGEgPSByZXNwb25zZTtcbiAgICAgIHRoaXMudmFsdWVLZXkgPSAndG90YWxDb3VudCc7XG4gICAgICB0aGlzLmhlYXRQb2ludHMgPSB7ZGF0YTogW119O1xuICAgICAgdGhpcy5taW4gPSAwO1xuICAgICAgdGhpcy5tYXggPSAwO1xuXG4gICAgICBPYmplY3Qua2V5cyh0aGlzLmlucHV0RGF0YSkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICBjb25zdCBkaWFncmFtQ29udGFpbmVyID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ3N2ZycpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLFxuICAgICAgICAgIGRpYWdyYW1FbG0gPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnRcbiAgICAgICAgICAgIC5xdWVyeVNlbGVjdG9yKGBnW2RhdGEtZWxlbWVudC1pZD0ke2tleX1dYClcbiAgICAgICAgICAgIC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgdGhpcy5zZXRNYXgoa2V5KTtcbiAgICAgICAgdGhpcy5oZWF0UG9pbnRzLmRhdGEucHVzaCh7XG4gICAgICAgICAgeDogTWF0aC5yb3VuZChkaWFncmFtRWxtLnggLSBkaWFncmFtQ29udGFpbmVyLnggKyBkaWFncmFtRWxtLndpZHRoIC8gMiksXG4gICAgICAgICAgeTogTWF0aC5yb3VuZChkaWFncmFtRWxtLnkgLSBkaWFncmFtQ29udGFpbmVyLnkgKyBkaWFncmFtRWxtLmhlaWdodCAvIDIpLFxuICAgICAgICAgIHZhbHVlOiB0aGlzLmlucHV0RGF0YVtrZXldW3RoaXMudmFsdWVLZXldLFxuICAgICAgICAgIHJhZGl1czogZGlhZ3JhbUVsbS53aWR0aCAvIDIsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmFkZENvdW50ZXJBY3RpdmVPdmVybGF5cyhrZXksIHRoaXMuaW5wdXREYXRhKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5jbGVhckhlYXRtYXAoKTtcbiAgICAgIGlmICh0aGlzLnNob3dIZWF0bWFwKSB7XG4gICAgICAgIHRoaXMubG9hZEhlYXRtYXAoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBvbldpbmRvd1Jlc2l6ZSgpIHtcbiAgICBjb25zdCBvbGRDYW52YXMgPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignY2FudmFzW2NsYXNzPWhlYXRtYXAtY2FudmFzXScpO1xuICAgIGlmIChvbGRDYW52YXMpIHtcbiAgICAgIG9sZENhbnZhcy5yZW1vdmUoKTtcbiAgICAgIHRoaXMuaGVhdE1hcEluc3RhbmNlID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKHRoaXMuc2hvd0hlYXRtYXApIHtcbiAgICAgIHRoaXMubG9hZEhlYXRtYXAoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgbG9hZFByb2Nlc3NEZWZpbml0aW9uSGVhdG1hcER1cmF0aW9uKHByb2Nlc3NEZWZpbml0aW9uKSB7XG4gICAgdGhpcy5wcm9jZXNzU2VydmljZS5nZXRQcm9jZXNzSGVhdG1hcER1cmF0aW9uKHByb2Nlc3NEZWZpbml0aW9uKS5zdWJzY3JpYmUocmVzcG9uc2UgPT4ge1xuICAgICAgdGhpcy5pbnB1dERhdGEgPSByZXNwb25zZTtcbiAgICAgIHRoaXMudmFsdWVLZXkgPSAnYXZlcmFnZUR1cmF0aW9uSW5NaWxsaXNlY29uZHMnO1xuICAgICAgdGhpcy5oZWF0UG9pbnRzID0ge2RhdGE6IFtdfTtcbiAgICAgIHRoaXMubWluID0gMDtcbiAgICAgIHRoaXMubWF4ID0gMDtcblxuICAgICAgT2JqZWN0LmtleXModGhpcy5pbnB1dERhdGEpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgY29uc3QgZGlhZ3JhbUNvbnRhaW5lciA9IHRoaXMuZWwubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCdzdmcnKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxcbiAgICAgICAgICBkaWFncmFtRWxtID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50XG4gICAgICAgICAgICAucXVlcnlTZWxlY3RvcihgZ1tkYXRhLWVsZW1lbnQtaWQ9JHtrZXl9XWApXG4gICAgICAgICAgICAuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIHRoaXMuc2V0TWF4KGtleSk7XG4gICAgICAgIHRoaXMuaGVhdFBvaW50cy5kYXRhLnB1c2goe1xuICAgICAgICAgIHg6IE1hdGgucm91bmQoZGlhZ3JhbUVsbS54IC0gZGlhZ3JhbUNvbnRhaW5lci54ICsgZGlhZ3JhbUVsbS53aWR0aCAvIDIpLFxuICAgICAgICAgIHk6IE1hdGgucm91bmQoZGlhZ3JhbUVsbS55IC0gZGlhZ3JhbUNvbnRhaW5lci55ICsgZGlhZ3JhbUVsbS5oZWlnaHQgLyAyKSxcbiAgICAgICAgICB2YWx1ZTogdGhpcy5pbnB1dERhdGFba2V5XVt0aGlzLnZhbHVlS2V5XSxcbiAgICAgICAgICByYWRpdXM6IGRpYWdyYW1FbG0ud2lkdGggLyAyLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5hZGRDb3VudGVyQWN0aXZlT3ZlcmxheXMoa2V5LCB0aGlzLmlucHV0RGF0YSk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuY2xlYXJIZWF0bWFwKCk7XG4gICAgICBpZiAodGhpcy5zaG93SGVhdG1hcCkge1xuICAgICAgICB0aGlzLmxvYWRIZWF0bWFwKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgc2V0UHJvY2Vzc0RlZmluaXRpb25LZXkocHJvY2Vzc0RlZmluaXRpb25LZXkpIHtcbiAgICB0aGlzLnByb2Nlc3NEZWZpbml0aW9uS2V5ID0gcHJvY2Vzc0RlZmluaXRpb25LZXk7XG4gICAgdGhpcy5sb2FkUHJvY2Vzc0RlZmluaXRpb25Gcm9tS2V5KHRoaXMucHJvY2Vzc0RlZmluaXRpb25LZXkpO1xuICB9XG5cbiAgcHVibGljIHNldFByb2Nlc3NEZWZpbml0aW9uVmVyc2lvbih2ZXJzaW9uKSB7XG4gICAgdGhpcy52ZXJzaW9uID0gK3ZlcnNpb247XG4gICAgdGhpcy5sb2FkSGVhdG1hcERhdGEoKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRIZWF0bWFwT3B0aW9uKGhlYXRtYXBPcHRpb24pIHtcbiAgICB0aGlzLmhlYXRtYXBPcHRpb24gPSBoZWF0bWFwT3B0aW9uO1xuICAgIHRoaXMubG9hZEhlYXRtYXBEYXRhKCk7XG4gIH1cblxuICBwdWJsaWMgdG9nZ2xlU2hvd0hlYXRtYXAoKSB7XG4gICAgdGhpcy5zaG93SGVhdG1hcCA9ICF0aGlzLnNob3dIZWF0bWFwO1xuICAgIHRoaXMubG9hZEhlYXRtYXBEYXRhKCk7XG4gIH1cblxuICBwdWJsaWMgbG9hZEhlYXRtYXAoKSB7XG4gICAgaWYgKCF0aGlzLmhlYXRNYXBJbnN0YW5jZSkge1xuICAgICAgdGhpcy5oZWF0TWFwSW5zdGFuY2UgPSBoZWF0bWFwLmNyZWF0ZSh7XG4gICAgICAgIHJhZGl1czogNTQsXG4gICAgICAgIGJsdXI6IDAuNyxcbiAgICAgICAgbWF4T3BhY2l0eTogMC40LFxuICAgICAgICBtaW5PcGFjaXR5OiAwLFxuICAgICAgICBjb250YWluZXI6IHRoaXMuZWwubmF0aXZlRWxlbWVudCxcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLmhlYXRNYXBJbnN0YW5jZS5zZXREYXRhKHtcbiAgICAgIG1pbjogdGhpcy5taW4sXG4gICAgICBtYXg6IHRoaXMubWF4LFxuICAgICAgZGF0YTogdGhpcy5oZWF0UG9pbnRzLmRhdGEsXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgY2xlYXJIZWF0bWFwKCkge1xuICAgIGlmICh0aGlzLmhlYXRNYXBJbnN0YW5jZSkge1xuICAgICAgdGhpcy5oZWF0TWFwSW5zdGFuY2Uuc2V0RGF0YSh7ZGF0YTogW119KTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgbG9hZEhlYXRtYXBEYXRhKCkge1xuICAgIHRoaXMucHJvY2Vzc0RlZmluaXRpb24gPSB0aGlzLnByb2Nlc3NEZWZpbml0aW9uVmVyc2lvbnMuZmluZChcbiAgICAgIGRlZmluaXRpb24gPT4gZGVmaW5pdGlvbi52ZXJzaW9uID09PSB0aGlzLnZlcnNpb25cbiAgICApO1xuXG4gICAgaWYgKHRoaXMuaGVhdG1hcE9wdGlvbiA9PT0gJ2NvdW50Jykge1xuICAgICAgdGhpcy5sb2FkUHJvY2Vzc0RlZmluaXRpb25IZWF0bWFwQ291bnQodGhpcy5wcm9jZXNzRGVmaW5pdGlvbik7XG4gICAgfVxuICAgIGlmICh0aGlzLmhlYXRtYXBPcHRpb24gPT09ICdkdXJhdGlvbicpIHtcbiAgICAgIHRoaXMubG9hZFByb2Nlc3NEZWZpbml0aW9uSGVhdG1hcER1cmF0aW9uKHRoaXMucHJvY2Vzc0RlZmluaXRpb24pO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzZXRNYXgoa2V5OiBhbnkpIHtcbiAgICBpZiAodGhpcy5oZWF0bWFwRHVyYXRpb24pIHtcbiAgICAgIHRoaXMubWF4ID0gTWF0aC5tYXgodGhpcy5oZWF0bWFwRHVyYXRpb25ba2V5XS5hdmVyYWdlRHVyYXRpb25Jbk1pbGxpc2Vjb25kcywgdGhpcy5tYXgpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5oZWF0bWFwQ291bnQpIHtcbiAgICAgIHRoaXMubWF4ID0gTWF0aC5tYXgoXG4gICAgICAgIHRoaXMuaGVhdG1hcENvdW50W2tleV0udG90YWxDb3VudCArIHRoaXMuaGVhdG1hcENvdW50W2tleV0uY291bnQsXG4gICAgICAgIHRoaXMubWF4XG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBhZGRDb3VudGVyQWN0aXZlT3ZlcmxheXMoa2V5OiBhbnksIGlucHV0RGF0YTogYW55KSB7XG4gICAgY29uc3Qgb3ZlcmxheXMgPSB0aGlzLmJwbW5KUy5nZXQoJ292ZXJsYXlzJyk7XG4gICAgb3ZlcmxheXMuYWRkKGtleSwge1xuICAgICAgcG9zaXRpb246IHtcbiAgICAgICAgYm90dG9tOiAxMyxcbiAgICAgICAgbGVmdDogLTEyLFxuICAgICAgfSxcbiAgICAgIHNob3c6IHtcbiAgICAgICAgbWluWm9vbTogMCxcbiAgICAgICAgbWF4Wm9vbTogNS4wLFxuICAgICAgfSxcbiAgICAgIGh0bWw6IGA8c3BhbiBjbGFzcz1cImJhZGdlIGJhZGdlLXBpbGwgYmFkZ2UtcHJpbWFyeVwiPiR7aW5wdXREYXRhW2tleV0uY291bnR9PC9zcGFuPmAsXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
1
+ /*
2
+ * Copyright 2015-2020 Ritense BV, the Netherlands.
3
+ *
4
+ * Licensed under EUPL, Version 1.2 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" basis,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+ import { Component, ElementRef, EventEmitter, Input, Output, ViewChild, ViewEncapsulation, } from '@angular/core';
17
+ import { ProcessService } from '../process.service';
18
+ import * as BpmnJS from 'bpmn-js/dist/bpmn-navigated-viewer.production.min.js';
19
+ import * as heatmap from 'heatmap.js-fixed/build/heatmap.js';
20
+ export class ProcessDiagramComponent {
21
+ constructor(processService) {
22
+ this.processService = processService;
23
+ this.importDone = new EventEmitter();
24
+ this.enumHeatmapOptions = ['count', 'duration'];
25
+ }
26
+ ngOnInit() {
27
+ if (this.processDefinitionKey) {
28
+ this.loadProcessDefinitionFromKey(this.processDefinitionKey);
29
+ }
30
+ if (this.processInstanceId) {
31
+ this.loadProcessInstanceXml(this.processInstanceId);
32
+ }
33
+ this.bpmnJS = new BpmnJS();
34
+ this.bpmnJS.on('import.done', ({ error }) => {
35
+ if (!error) {
36
+ const canvas = this.bpmnJS.get('canvas'), eventBus = this.bpmnJS.get('eventBus');
37
+ if (this.processDiagram.historicActivityInstances) {
38
+ this.processDiagram.historicActivityInstances.forEach(instance => {
39
+ // exclude multiInstanceBody
40
+ if (instance.activityType !== 'multiInstanceBody') {
41
+ canvas.addMarker(instance.activityId, instance.endTime ? 'highlight-overlay-past' : 'highlight-overlay-current');
42
+ }
43
+ });
44
+ }
45
+ canvas.zoom('fit-viewport', 'auto');
46
+ if (this.processDefinitionVersions) {
47
+ eventBus.on('canvas.init', () => {
48
+ if (this.showHeatmap) {
49
+ this.clearHeatmap();
50
+ }
51
+ this.loadHeatmapData();
52
+ });
53
+ eventBus.on('canvas.viewbox.changing', () => {
54
+ if (this.showHeatmap) {
55
+ this.clearHeatmap();
56
+ }
57
+ });
58
+ eventBus.on('canvas.viewbox.changed', () => {
59
+ this.loadHeatmapData();
60
+ });
61
+ }
62
+ }
63
+ });
64
+ }
65
+ ngOnChanges() {
66
+ if (this.processDefinitionKey) {
67
+ this.loadProcessDefinitionFromKey(this.processDefinitionKey);
68
+ }
69
+ else if (this.processInstanceId) {
70
+ this.loadProcessInstanceXml(this.processInstanceId);
71
+ }
72
+ }
73
+ ngOnDestroy() {
74
+ if (this.bpmnJS) {
75
+ this.bpmnJS.destroy();
76
+ }
77
+ }
78
+ loadProcessDefinition(processDefinitionKey) {
79
+ this.processService.getProcessDefinition(processDefinitionKey).subscribe(response => {
80
+ this.heatmapOption = this.enumHeatmapOptions[0];
81
+ this.version = response.version;
82
+ this.loadProcessDefinitionXml(response.id);
83
+ });
84
+ }
85
+ loadProcessDefinitionVersions(processDefinitionKey) {
86
+ this.processService.getProcessDefinitionVersions(processDefinitionKey).subscribe(response => {
87
+ this.processDefinitionVersions = response;
88
+ });
89
+ }
90
+ loadProcessDefinitionFromKey(processDefinitionKey) {
91
+ this.loadProcessDefinitionVersions(processDefinitionKey);
92
+ this.loadProcessDefinition(processDefinitionKey);
93
+ }
94
+ loadProcessDefinitionXml(processDefinitionId) {
95
+ this.processService.getProcessDefinitionXml(processDefinitionId).subscribe(response => {
96
+ this.processDiagram = response;
97
+ this.bpmnJS.importXML(this.processDiagram.bpmn20Xml);
98
+ this.bpmnJS.attachTo(this.el.nativeElement);
99
+ });
100
+ }
101
+ loadProcessInstanceXml(processInstanceId) {
102
+ this.processService.getProcessXml(processInstanceId).subscribe(response => {
103
+ this.processDiagram = response;
104
+ this.bpmnJS.importXML(this.processDiagram.bpmn20Xml);
105
+ this.bpmnJS.attachTo(this.el.nativeElement);
106
+ });
107
+ }
108
+ loadProcessDefinitionHeatmapCount(processDefinition) {
109
+ this.processService.getProcessHeatmapCount(processDefinition).subscribe(response => {
110
+ this.inputData = response;
111
+ this.valueKey = 'totalCount';
112
+ this.heatPoints = { data: [] };
113
+ this.min = 0;
114
+ this.max = 0;
115
+ Object.keys(this.inputData).forEach(key => {
116
+ const diagramContainer = this.el.nativeElement.querySelector('svg').getBoundingClientRect(), diagramElm = this.el.nativeElement
117
+ .querySelector(`g[data-element-id=${key}]`)
118
+ .getBoundingClientRect();
119
+ this.setMax(key);
120
+ this.heatPoints.data.push({
121
+ x: Math.round(diagramElm.x - diagramContainer.x + diagramElm.width / 2),
122
+ y: Math.round(diagramElm.y - diagramContainer.y + diagramElm.height / 2),
123
+ value: this.inputData[key][this.valueKey],
124
+ radius: diagramElm.width / 2,
125
+ });
126
+ this.addCounterActiveOverlays(key, this.inputData);
127
+ });
128
+ this.clearHeatmap();
129
+ if (this.showHeatmap) {
130
+ this.loadHeatmap();
131
+ }
132
+ });
133
+ }
134
+ onWindowResize() {
135
+ const oldCanvas = this.el.nativeElement.querySelector('canvas[class=heatmap-canvas]');
136
+ if (oldCanvas) {
137
+ oldCanvas.remove();
138
+ this.heatMapInstance = null;
139
+ }
140
+ if (this.showHeatmap) {
141
+ this.loadHeatmap();
142
+ }
143
+ }
144
+ loadProcessDefinitionHeatmapDuration(processDefinition) {
145
+ this.processService.getProcessHeatmapDuration(processDefinition).subscribe(response => {
146
+ this.inputData = response;
147
+ this.valueKey = 'averageDurationInMilliseconds';
148
+ this.heatPoints = { data: [] };
149
+ this.min = 0;
150
+ this.max = 0;
151
+ Object.keys(this.inputData).forEach(key => {
152
+ const diagramContainer = this.el.nativeElement.querySelector('svg').getBoundingClientRect(), diagramElm = this.el.nativeElement
153
+ .querySelector(`g[data-element-id=${key}]`)
154
+ .getBoundingClientRect();
155
+ this.setMax(key);
156
+ this.heatPoints.data.push({
157
+ x: Math.round(diagramElm.x - diagramContainer.x + diagramElm.width / 2),
158
+ y: Math.round(diagramElm.y - diagramContainer.y + diagramElm.height / 2),
159
+ value: this.inputData[key][this.valueKey],
160
+ radius: diagramElm.width / 2,
161
+ });
162
+ this.addCounterActiveOverlays(key, this.inputData);
163
+ });
164
+ this.clearHeatmap();
165
+ if (this.showHeatmap) {
166
+ this.loadHeatmap();
167
+ }
168
+ });
169
+ }
170
+ setProcessDefinitionKey(processDefinitionKey) {
171
+ this.processDefinitionKey = processDefinitionKey;
172
+ this.loadProcessDefinitionFromKey(this.processDefinitionKey);
173
+ }
174
+ setProcessDefinitionVersion(version) {
175
+ this.version = +version;
176
+ this.loadHeatmapData();
177
+ }
178
+ setHeatmapOption(heatmapOption) {
179
+ this.heatmapOption = heatmapOption;
180
+ this.loadHeatmapData();
181
+ }
182
+ toggleShowHeatmap() {
183
+ this.showHeatmap = !this.showHeatmap;
184
+ this.loadHeatmapData();
185
+ }
186
+ loadHeatmap() {
187
+ if (!this.heatMapInstance) {
188
+ this.heatMapInstance = heatmap.create({
189
+ radius: 54,
190
+ blur: 0.7,
191
+ maxOpacity: 0.4,
192
+ minOpacity: 0,
193
+ container: this.el.nativeElement,
194
+ });
195
+ }
196
+ this.heatMapInstance.setData({
197
+ min: this.min,
198
+ max: this.max,
199
+ data: this.heatPoints.data,
200
+ });
201
+ }
202
+ clearHeatmap() {
203
+ if (this.heatMapInstance) {
204
+ this.heatMapInstance.setData({ data: [] });
205
+ }
206
+ }
207
+ loadHeatmapData() {
208
+ this.processDefinition = this.processDefinitionVersions.find(definition => definition.version === this.version);
209
+ if (this.heatmapOption === 'count') {
210
+ this.loadProcessDefinitionHeatmapCount(this.processDefinition);
211
+ }
212
+ if (this.heatmapOption === 'duration') {
213
+ this.loadProcessDefinitionHeatmapDuration(this.processDefinition);
214
+ }
215
+ }
216
+ setMax(key) {
217
+ if (this.heatmapDuration) {
218
+ this.max = Math.max(this.heatmapDuration[key].averageDurationInMilliseconds, this.max);
219
+ }
220
+ else if (this.heatmapCount) {
221
+ this.max = Math.max(this.heatmapCount[key].totalCount + this.heatmapCount[key].count, this.max);
222
+ }
223
+ }
224
+ addCounterActiveOverlays(key, inputData) {
225
+ const overlays = this.bpmnJS.get('overlays');
226
+ overlays.add(key, {
227
+ position: {
228
+ bottom: 13,
229
+ left: -12,
230
+ },
231
+ show: {
232
+ minZoom: 0,
233
+ maxZoom: 5.0,
234
+ },
235
+ html: `<span class="badge badge-pill badge-primary">${inputData[key].count}</span>`,
236
+ });
237
+ }
238
+ }
239
+ ProcessDiagramComponent.decorators = [
240
+ { type: Component, args: [{
241
+ selector: 'valtimo-process-diagram',
242
+ template: "<!--\n ~ Copyright 2015-2020 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n<div class=\"process-diagram-container\">\n <div *ngIf=\"processDefinitionKey\" class=\"diagram-container-switch-holder\">\n <div class=\"container-fluid\">\n <div class=\"row p-4 bg-light\">\n <div class=\"col-4\">\n <label><strong>Version</strong></label\n ><br />\n <select class=\"form-control\" (change)=\"setProcessDefinitionVersion($event.target.value)\">\n <option\n *ngFor=\"let processDefinitionVersion of processDefinitionVersions\"\n [value]=\"processDefinitionVersion.version\"\n [selected]=\"processDefinitionVersion.version === version\"\n >\n {{ processDefinitionVersion.version }}\n </option>\n </select>\n </div>\n <div class=\"col-4\">\n <label><strong>Heatmap type</strong></label\n ><br />\n <select class=\"form-control\" (change)=\"setHeatmapOption($event.target.value)\">\n <option\n *ngFor=\"let option of enumHeatmapOptions\"\n [value]=\"option\"\n [selected]=\"option === heatmapOption\"\n >\n {{ option }}\n </option>\n </select>\n </div>\n <div class=\"col-4 text-right\">\n <label><strong>Show heatmap</strong></label\n ><br />\n <div class=\"text-left switch-button switch-button-sm switch-button-success\">\n <input\n type=\"checkbox\"\n id=\"toggleHeatmap\"\n [checked]=\"showHeatmap\"\n (click)=\"toggleShowHeatmap()\"\n /><span> <label for=\"toggleHeatmap\"></label></span>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div #ref (window:resize)=\"onWindowResize()\" class=\"diagram-container\"></div>\n\n <div *ngIf=\"processInstanceId\" class=\"p-4 text-center legenda-holder\">\n <span\n ><div class=\"legenda highlight-overlay-past\"></div>\n Executed tasks</span\n >\n <span class=\"ml-3\"\n ><div class=\"legenda highlight-overlay-current\"></div>\n Current tasks</span\n >\n </div>\n\n <div *ngIf=\"processDefinitionKey\" class=\"p-4 text-center legenda-holder\">\n <span\n ><span class=\"badge badge-pill badge-primary\">N</span>&nbsp;&nbsp;Amount of currently active\n instances of this task.</span\n >\n <span\n >&nbsp;&nbsp;|&nbsp;&nbsp;Red/yellow/green orbs: The amount of times the task is executed in\n comparison to the other tasks.</span\n >\n </div>\n</div>\n",
243
+ encapsulation: ViewEncapsulation.None,
244
+ styles: [".process-diagram-container .diagram-container{height:50vh;width:100%}.process-diagram-container .diagram-container-switch-holder{position:absolute;width:100%;z-index:1000}.process-diagram-container .highlight-overlay-past:not(.djs-connection) .djs-visual>:first-child{fill:#d8d8d8!important}.process-diagram-container .highlight-overlay-current:not(.djs-connection) .djs-visual>:first-child{fill:#b2e0ff!important}.process-diagram-container .legenda-holder{font-size:1em}.process-diagram-container .legenda{border:2px solid #000;border-radius:3px;display:inline-block;margin-bottom:-4px;margin-right:5px;padding:7px}.process-diagram-container .legenda.highlight-overlay-past{background-color:#d8d8d8}.process-diagram-container .legenda.highlight-overlay-current{background-color:#b2e0ff}"]
245
+ },] }
246
+ ];
247
+ ProcessDiagramComponent.ctorParameters = () => [
248
+ { type: ProcessService }
249
+ ];
250
+ ProcessDiagramComponent.propDecorators = {
251
+ el: [{ type: ViewChild, args: ['ref', { static: true },] }],
252
+ importDone: [{ type: Output }],
253
+ processDefinitionKey: [{ type: Input }],
254
+ processInstanceId: [{ type: Input }]
255
+ };
256
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvY2Vzcy1kaWFncmFtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIvdG1wL2plbmtpbnMtM2ZmM2ExOWEvd29ya3NwYWNlL3JvbnRlbmRfbGlicmFyaWVzXy1fcmVsZWFzZV9tYWluL3Byb2plY3RzL3ZhbHRpbW8vcHJvY2Vzcy9zcmMvIiwic291cmNlcyI6WyJsaWIvcHJvY2Vzcy1kaWFncmFtL3Byb2Nlc3MtZGlhZ3JhbS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFFSCxPQUFPLEVBQ0wsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osS0FBSyxFQUlMLE1BQU0sRUFDTixTQUFTLEVBQ1QsaUJBQWlCLEdBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUVsRCxPQUFPLEtBQUssTUFBTSxNQUFNLHNEQUFzRCxDQUFDO0FBQy9FLE9BQU8sS0FBSyxPQUFPLE1BQU0sbUNBQW1DLENBQUM7QUFRN0QsTUFBTSxPQUFPLHVCQUF1QjtJQXlCbEMsWUFBb0IsY0FBOEI7UUFBOUIsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBcEJqQyxlQUFVLEdBQXNCLElBQUksWUFBWSxFQUFFLENBQUM7UUFXN0QsdUJBQWtCLEdBQUcsQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFTRyxDQUFDO0lBRXRELFFBQVE7UUFDTixJQUFJLElBQUksQ0FBQyxvQkFBb0IsRUFBRTtZQUM3QixJQUFJLENBQUMsNEJBQTRCLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUM7U0FDOUQ7UUFDRCxJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtZQUMxQixJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7U0FDckQ7UUFDRCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksTUFBTSxFQUFFLENBQUM7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QyxFQUFFO2FBQ1Y7WUFDRCxJQUFJLEVBQUU7Z0JBQ0osT0FBTyxFQUFFLENBQUM7Z0JBQ1YsT0FBTyxFQUFFLEdBQUc7YUFDYjtZQUNELElBQUksRUFBRSxnREFBZ0QsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssU0FBUztTQUNwRixDQUFDLENBQUM7SUFDTCxDQUFDOzs7WUFwUkYsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSx5QkFBeUI7Z0JBQ25DLDZyR0FBK0M7Z0JBRS9DLGFBQWEsRUFBRSxpQkFBaUIsQ0FBQyxJQUFJOzthQUN0Qzs7O1lBVk8sY0FBYzs7O2lCQWVuQixTQUFTLFNBQUMsS0FBSyxFQUFFLEVBQUMsTUFBTSxFQUFFLElBQUksRUFBQzt5QkFDL0IsTUFBTTttQ0FDTixLQUFLO2dDQUNMLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IDIwMTUtMjAyMCBSaXRlbnNlIEJWLCB0aGUgTmV0aGVybGFuZHMuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgRVVQTCwgVmVyc2lvbiAxLjIgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwczovL2pvaW51cC5lYy5ldXJvcGEuZXUvY29sbGVjdGlvbi9ldXBsL2V1cGwtdGV4dC1ldXBsLTEyXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIGJhc2lzLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQge1xuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgVmlld0NoaWxkLFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1Byb2Nlc3NTZXJ2aWNlfSBmcm9tICcuLi9wcm9jZXNzLnNlcnZpY2UnO1xuXG5pbXBvcnQgKiBhcyBCcG1uSlMgZnJvbSAnYnBtbi1qcy9kaXN0L2JwbW4tbmF2aWdhdGVkLXZpZXdlci5wcm9kdWN0aW9uLm1pbi5qcyc7XG5pbXBvcnQgKiBhcyBoZWF0bWFwIGZyb20gJ2hlYXRtYXAuanMtZml4ZWQvYnVpbGQvaGVhdG1hcC5qcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3ZhbHRpbW8tcHJvY2Vzcy1kaWFncmFtJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3Byb2Nlc3MtZGlhZ3JhbS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3Byb2Nlc3MtZGlhZ3JhbS5jb21wb25lbnQuc2NzcyddLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxufSlcbmV4cG9ydCBjbGFzcyBQcm9jZXNzRGlhZ3JhbUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBPbkNoYW5nZXMge1xuICBwcml2YXRlIGJwbW5KUzogQnBtbkpTO1xuICBwcml2YXRlIGhlYXRNYXBJbnN0YW5jZTogYW55O1xuXG4gIEBWaWV3Q2hpbGQoJ3JlZicsIHtzdGF0aWM6IHRydWV9KSBwdWJsaWMgZWw6IEVsZW1lbnRSZWY7XG4gIEBPdXRwdXQoKSBwdWJsaWMgaW1wb3J0RG9uZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBJbnB1dCgpIHB1YmxpYyBwcm9jZXNzRGVmaW5pdGlvbktleT86IHN0cmluZztcbiAgQElucHV0KCkgcHVibGljIHByb2Nlc3NJbnN0YW5jZUlkPzogc3RyaW5nO1xuXG4gIHB1YmxpYyBwcm9jZXNzRGlhZ3JhbTogYW55O1xuICBwdWJsaWMgcHJvY2Vzc0RlZmluaXRpb246IGFueTtcbiAgcHVibGljIHByb2Nlc3NEZWZpbml0aW9uVmVyc2lvbnM6IGFueTtcbiAgcHVibGljIGhlYXRtYXBDb3VudDogYW55O1xuICBwdWJsaWMgaGVhdG1hcER1cmF0aW9uOiBhbnk7XG4gIHB1YmxpYyB0YXNrc0NvdW50OiBhbnk7XG4gIHB1YmxpYyBzaG93SGVhdG1hcDogYm9vbGVhbjtcbiAgcHVibGljIGVudW1IZWF0bWFwT3B0aW9ucyA9IFsnY291bnQnLCAnZHVyYXRpb24nXTtcbiAgcHVibGljIGhlYXRtYXBPcHRpb246IHN0cmluZztcbiAgcHVibGljIHZlcnNpb246IGFueTtcbiAgcHVibGljIGhlYXRQb2ludHM6IGFueTtcbiAgcHVibGljIG1pbjogbnVtYmVyO1xuICBwdWJsaWMgbWF4OiBudW1iZXI7XG4gIHB1YmxpYyBpbnB1dERhdGE6IGFueTtcbiAgcHVibGljIHZhbHVlS2V5OiBhbnk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBwcm9jZXNzU2VydmljZTogUHJvY2Vzc1NlcnZpY2UpIHt9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgaWYgKHRoaXMucHJvY2Vzc0RlZmluaXRpb25LZXkpIHtcbiAgICAgIHRoaXMubG9hZFByb2Nlc3NEZWZpbml0aW9uRnJvbUtleSh0aGlzLnByb2Nlc3NEZWZpbml0aW9uS2V5KTtcbiAgICB9XG4gICAgaWYgKHRoaXMucHJvY2Vzc0luc3RhbmNlSWQpIHtcbiAgICAgIHRoaXMubG9hZFByb2Nlc3NJbnN0YW5jZVhtbCh0aGlzLnByb2Nlc3NJbnN0YW5jZUlkKTtcbiAgICB9XG4gICAgdGhpcy5icG1uSlMgPSBuZXcgQnBtbkpTKCk7XG4gICAgdGhpcy5icG1uSlMub24oJ2ltcG9ydC5kb25lJywgKHtlcnJvcn0pID0+IHtcbiAgICAgIGlmICghZXJyb3IpIHtcbiAgICAgICAgY29uc3QgY2FudmFzID0gdGhpcy5icG1uSlMuZ2V0KCdjYW52YXMnKSxcbiAgICAgICAgICBldmVudEJ1cyA9IHRoaXMuYnBtbkpTLmdldCgnZXZlbnRCdXMnKTtcbiAgICAgICAgaWYgKHRoaXMucHJvY2Vzc0RpYWdyYW0uaGlzdG9yaWNBY3Rpdml0eUluc3RhbmNlcykge1xuICAgICAgICAgIHRoaXMucHJvY2Vzc0RpYWdyYW0uaGlzdG9yaWNBY3Rpdml0eUluc3RhbmNlcy5mb3JFYWNoKGluc3RhbmNlID0+IHtcbiAgICAgICAgICAgIC8vIGV4Y2x1ZGUgbXVsdGlJbnN0YW5jZUJvZHlcbiAgICAgICAgICAgIGlmIChpbnN0YW5jZS5hY3Rpdml0eVR5cGUgIT09ICdtdWx0aUluc3RhbmNlQm9keScpIHtcbiAgICAgICAgICAgICAgY2FudmFzLmFkZE1hcmtlcihcbiAgICAgICAgICAgICAgICBpbnN0YW5jZS5hY3Rpdml0eUlkLFxuICAgICAgICAgICAgICAgIGluc3RhbmNlLmVuZFRpbWUgPyAnaGlnaGxpZ2h0LW92ZXJsYXktcGFzdCcgOiAnaGlnaGxpZ2h0LW92ZXJsYXktY3VycmVudCdcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNhbnZhcy56b29tKCdmaXQtdmlld3BvcnQnLCAnYXV0bycpO1xuICAgICAgICBpZiAodGhpcy5wcm9jZXNzRGVmaW5pdGlvblZlcnNpb25zKSB7XG4gICAgICAgICAgZXZlbnRCdXMub24oJ2NhbnZhcy5pbml0JywgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuc2hvd0hlYXRtYXApIHtcbiAgICAgICAgICAgICAgdGhpcy5jbGVhckhlYXRtYXAoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMubG9hZEhlYXRtYXBEYXRhKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgZXZlbnRCdXMub24oJ2NhbnZhcy52aWV3Ym94LmNoYW5naW5nJywgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuc2hvd0hlYXRtYXApIHtcbiAgICAgICAgICAgICAgdGhpcy5jbGVhckhlYXRtYXAoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBldmVudEJ1cy5vbignY2FudmFzLnZpZXdib3guY2hhbmdlZCcsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMubG9hZEhlYXRtYXBEYXRhKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnByb2Nlc3NEZWZpbml0aW9uS2V5KSB7XG4gICAgICB0aGlzLmxvYWRQcm9jZXNzRGVmaW5pdGlvbkZyb21LZXkodGhpcy5wcm9jZXNzRGVmaW5pdGlvbktleSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnByb2Nlc3NJbnN0YW5jZUlkKSB7XG4gICAgICB0aGlzLmxvYWRQcm9jZXNzSW5zdGFuY2VYbWwodGhpcy5wcm9jZXNzSW5zdGFuY2VJZCk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgaWYgKHRoaXMuYnBtbkpTKSB7XG4gICAgICB0aGlzLmJwbW5KUy5kZXN0cm95KCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGxvYWRQcm9jZXNzRGVmaW5pdGlvbihwcm9jZXNzRGVmaW5pdGlvbktleSkge1xuICAgIHRoaXMucHJvY2Vzc1NlcnZpY2UuZ2V0UHJvY2Vzc0RlZmluaXRpb24ocHJvY2Vzc0RlZmluaXRpb25LZXkpLnN1YnNjcmliZShyZXNwb25zZSA9PiB7XG4gICAgICB0aGlzLmhlYXRtYXBPcHRpb24gPSB0aGlzLmVudW1IZWF0bWFwT3B0aW9uc1swXTtcbiAgICAgIHRoaXMudmVyc2lvbiA9IHJlc3BvbnNlLnZlcnNpb247XG4gICAgICB0aGlzLmxvYWRQcm9jZXNzRGVmaW5pdGlvblhtbChyZXNwb25zZS5pZCk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgbG9hZFByb2Nlc3NEZWZpbml0aW9uVmVyc2lvbnMocHJvY2Vzc0RlZmluaXRpb25LZXkpIHtcbiAgICB0aGlzLnByb2Nlc3NTZXJ2aWNlLmdldFByb2Nlc3NEZWZpbml0aW9uVmVyc2lvbnMocHJvY2Vzc0RlZmluaXRpb25LZXkpLnN1YnNjcmliZShyZXNwb25zZSA9PiB7XG4gICAgICB0aGlzLnByb2Nlc3NEZWZpbml0aW9uVmVyc2lvbnMgPSByZXNwb25zZTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBsb2FkUHJvY2Vzc0RlZmluaXRpb25Gcm9tS2V5KHByb2Nlc3NEZWZpbml0aW9uS2V5KSB7XG4gICAgdGhpcy5sb2FkUHJvY2Vzc0RlZmluaXRpb25WZXJzaW9ucyhwcm9jZXNzRGVmaW5pdGlvbktleSk7XG4gICAgdGhpcy5sb2FkUHJvY2Vzc0RlZmluaXRpb24ocHJvY2Vzc0RlZmluaXRpb25LZXkpO1xuICB9XG5cbiAgcHVibGljIGxvYWRQcm9jZXNzRGVmaW5pdGlvblhtbChwcm9jZXNzRGVmaW5pdGlvbklkKSB7XG4gICAgdGhpcy5wcm9jZXNzU2VydmljZS5nZXRQcm9jZXNzRGVmaW5pdGlvblhtbChwcm9jZXNzRGVmaW5pdGlvbklkKS5zdWJzY3JpYmUocmVzcG9uc2UgPT4ge1xuICAgICAgdGhpcy5wcm9jZXNzRGlhZ3JhbSA9IHJlc3BvbnNlO1xuICAgICAgdGhpcy5icG1uSlMuaW1wb3J0WE1MKHRoaXMucHJvY2Vzc0RpYWdyYW0uYnBtbjIwWG1sKTtcbiAgICAgIHRoaXMuYnBtbkpTLmF0dGFjaFRvKHRoaXMuZWwubmF0aXZlRWxlbWVudCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGxvYWRQcm9jZXNzSW5zdGFuY2VYbWwocHJvY2Vzc0luc3RhbmNlSWQpIHtcbiAgICB0aGlzLnByb2Nlc3NTZXJ2aWNlLmdldFByb2Nlc3NYbWwocHJvY2Vzc0luc3RhbmNlSWQpLnN1YnNjcmliZShyZXNwb25zZSA9PiB7XG4gICAgICB0aGlzLnByb2Nlc3NEaWFncmFtID0gcmVzcG9uc2U7XG4gICAgICB0aGlzLmJwbW5KUy5pbXBvcnRYTUwodGhpcy5wcm9jZXNzRGlhZ3JhbS5icG1uMjBYbWwpO1xuICAgICAgdGhpcy5icG1uSlMuYXR0YWNoVG8odGhpcy5lbC5uYXRpdmVFbGVtZW50KTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBsb2FkUHJvY2Vzc0RlZmluaXRpb25IZWF0bWFwQ291bnQocHJvY2Vzc0RlZmluaXRpb24pIHtcbiAgICB0aGlzLnByb2Nlc3NTZXJ2aWNlLmdldFByb2Nlc3NIZWF0bWFwQ291bnQocHJvY2Vzc0RlZmluaXRpb24pLnN1YnNjcmliZShyZXNwb25zZSA9PiB7XG4gICAgICB0aGlzLmlucHV0RGF0YSA9IHJlc3BvbnNlO1xuICAgICAgdGhpcy52YWx1ZUtleSA9ICd0b3RhbENvdW50JztcbiAgICAgIHRoaXMuaGVhdFBvaW50cyA9IHtkYXRhOiBbXX07XG4gICAgICB0aGlzLm1pbiA9IDA7XG4gICAgICB0aGlzLm1heCA9IDA7XG5cbiAgICAgIE9iamVjdC5rZXlzKHRoaXMuaW5wdXREYXRhKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgIGNvbnN0IGRpYWdyYW1Db250YWluZXIgPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3Rvcignc3ZnJykuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksXG4gICAgICAgICAgZGlhZ3JhbUVsbSA9IHRoaXMuZWwubmF0aXZlRWxlbWVudFxuICAgICAgICAgICAgLnF1ZXJ5U2VsZWN0b3IoYGdbZGF0YS1lbGVtZW50LWlkPSR7a2V5fV1gKVxuICAgICAgICAgICAgLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICB0aGlzLnNldE1heChrZXkpO1xuICAgICAgICB0aGlzLmhlYXRQb2ludHMuZGF0YS5wdXNoKHtcbiAgICAgICAgICB4OiBNYXRoLnJvdW5kKGRpYWdyYW1FbG0ueCAtIGRpYWdyYW1Db250YWluZXIueCArIGRpYWdyYW1FbG0ud2lkdGggLyAyKSxcbiAgICAgICAgICB5OiBNYXRoLnJvdW5kKGRpYWdyYW1FbG0ueSAtIGRpYWdyYW1Db250YWluZXIueSArIGRpYWdyYW1FbG0uaGVpZ2h0IC8gMiksXG4gICAgICAgICAgdmFsdWU6IHRoaXMuaW5wdXREYXRhW2tleV1bdGhpcy52YWx1ZUtleV0sXG4gICAgICAgICAgcmFkaXVzOiBkaWFncmFtRWxtLndpZHRoIC8gMixcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuYWRkQ291bnRlckFjdGl2ZU92ZXJsYXlzKGtleSwgdGhpcy5pbnB1dERhdGEpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLmNsZWFySGVhdG1hcCgpO1xuICAgICAgaWYgKHRoaXMuc2hvd0hlYXRtYXApIHtcbiAgICAgICAgdGhpcy5sb2FkSGVhdG1hcCgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG9uV2luZG93UmVzaXplKCkge1xuICAgIGNvbnN0IG9sZENhbnZhcyA9IHRoaXMuZWwubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCdjYW52YXNbY2xhc3M9aGVhdG1hcC1jYW52YXNdJyk7XG4gICAgaWYgKG9sZENhbnZhcykge1xuICAgICAgb2xkQ2FudmFzLnJlbW92ZSgpO1xuICAgICAgdGhpcy5oZWF0TWFwSW5zdGFuY2UgPSBudWxsO1xuICAgIH1cbiAgICBpZiAodGhpcy5zaG93SGVhdG1hcCkge1xuICAgICAgdGhpcy5sb2FkSGVhdG1hcCgpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBsb2FkUHJvY2Vzc0RlZmluaXRpb25IZWF0bWFwRHVyYXRpb24ocHJvY2Vzc0RlZmluaXRpb24pIHtcbiAgICB0aGlzLnByb2Nlc3NTZXJ2aWNlLmdldFByb2Nlc3NIZWF0bWFwRHVyYXRpb24ocHJvY2Vzc0RlZmluaXRpb24pLnN1YnNjcmliZShyZXNwb25zZSA9PiB7XG4gICAgICB0aGlzLmlucHV0RGF0YSA9IHJlc3BvbnNlO1xuICAgICAgdGhpcy52YWx1ZUtleSA9ICdhdmVyYWdlRHVyYXRpb25Jbk1pbGxpc2Vjb25kcyc7XG4gICAgICB0aGlzLmhlYXRQb2ludHMgPSB7ZGF0YTogW119O1xuICAgICAgdGhpcy5taW4gPSAwO1xuICAgICAgdGhpcy5tYXggPSAwO1xuXG4gICAgICBPYmplY3Qua2V5cyh0aGlzLmlucHV0RGF0YSkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICBjb25zdCBkaWFncmFtQ29udGFpbmVyID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ3N2ZycpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLFxuICAgICAgICAgIGRpYWdyYW1FbG0gPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnRcbiAgICAgICAgICAgIC5xdWVyeVNlbGVjdG9yKGBnW2RhdGEtZWxlbWVudC1pZD0ke2tleX1dYClcbiAgICAgICAgICAgIC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgdGhpcy5zZXRNYXgoa2V5KTtcbiAgICAgICAgdGhpcy5oZWF0UG9pbnRzLmRhdGEucHVzaCh7XG4gICAgICAgICAgeDogTWF0aC5yb3VuZChkaWFncmFtRWxtLnggLSBkaWFncmFtQ29udGFpbmVyLnggKyBkaWFncmFtRWxtLndpZHRoIC8gMiksXG4gICAgICAgICAgeTogTWF0aC5yb3VuZChkaWFncmFtRWxtLnkgLSBkaWFncmFtQ29udGFpbmVyLnkgKyBkaWFncmFtRWxtLmhlaWdodCAvIDIpLFxuICAgICAgICAgIHZhbHVlOiB0aGlzLmlucHV0RGF0YVtrZXldW3RoaXMudmFsdWVLZXldLFxuICAgICAgICAgIHJhZGl1czogZGlhZ3JhbUVsbS53aWR0aCAvIDIsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmFkZENvdW50ZXJBY3RpdmVPdmVybGF5cyhrZXksIHRoaXMuaW5wdXREYXRhKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5jbGVhckhlYXRtYXAoKTtcbiAgICAgIGlmICh0aGlzLnNob3dIZWF0bWFwKSB7XG4gICAgICAgIHRoaXMubG9hZEhlYXRtYXAoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRQcm9jZXNzRGVmaW5pdGlvbktleShwcm9jZXNzRGVmaW5pdGlvbktleSkge1xuICAgIHRoaXMucHJvY2Vzc0RlZmluaXRpb25LZXkgPSBwcm9jZXNzRGVmaW5pdGlvbktleTtcbiAgICB0aGlzLmxvYWRQcm9jZXNzRGVmaW5pdGlvbkZyb21LZXkodGhpcy5wcm9jZXNzRGVmaW5pdGlvbktleSk7XG4gIH1cblxuICBwdWJsaWMgc2V0UHJvY2Vzc0RlZmluaXRpb25WZXJzaW9uKHZlcnNpb24pIHtcbiAgICB0aGlzLnZlcnNpb24gPSArdmVyc2lvbjtcbiAgICB0aGlzLmxvYWRIZWF0bWFwRGF0YSgpO1xuICB9XG5cbiAgcHVibGljIHNldEhlYXRtYXBPcHRpb24oaGVhdG1hcE9wdGlvbikge1xuICAgIHRoaXMuaGVhdG1hcE9wdGlvbiA9IGhlYXRtYXBPcHRpb247XG4gICAgdGhpcy5sb2FkSGVhdG1hcERhdGEoKTtcbiAgfVxuXG4gIHB1YmxpYyB0b2dnbGVTaG93SGVhdG1hcCgpIHtcbiAgICB0aGlzLnNob3dIZWF0bWFwID0gIXRoaXMuc2hvd0hlYXRtYXA7XG4gICAgdGhpcy5sb2FkSGVhdG1hcERhdGEoKTtcbiAgfVxuXG4gIHB1YmxpYyBsb2FkSGVhdG1hcCgpIHtcbiAgICBpZiAoIXRoaXMuaGVhdE1hcEluc3RhbmNlKSB7XG4gICAgICB0aGlzLmhlYXRNYXBJbnN0YW5jZSA9IGhlYXRtYXAuY3JlYXRlKHtcbiAgICAgICAgcmFkaXVzOiA1NCxcbiAgICAgICAgYmx1cjogMC43LFxuICAgICAgICBtYXhPcGFjaXR5OiAwLjQsXG4gICAgICAgIG1pbk9wYWNpdHk6IDAsXG4gICAgICAgIGNvbnRhaW5lcjogdGhpcy5lbC5uYXRpdmVFbGVtZW50LFxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuaGVhdE1hcEluc3RhbmNlLnNldERhdGEoe1xuICAgICAgbWluOiB0aGlzLm1pbixcbiAgICAgIG1heDogdGhpcy5tYXgsXG4gICAgICBkYXRhOiB0aGlzLmhlYXRQb2ludHMuZGF0YSxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhckhlYXRtYXAoKSB7XG4gICAgaWYgKHRoaXMuaGVhdE1hcEluc3RhbmNlKSB7XG4gICAgICB0aGlzLmhlYXRNYXBJbnN0YW5jZS5zZXREYXRhKHtkYXRhOiBbXX0pO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBsb2FkSGVhdG1hcERhdGEoKSB7XG4gICAgdGhpcy5wcm9jZXNzRGVmaW5pdGlvbiA9IHRoaXMucHJvY2Vzc0RlZmluaXRpb25WZXJzaW9ucy5maW5kKFxuICAgICAgZGVmaW5pdGlvbiA9PiBkZWZpbml0aW9uLnZlcnNpb24gPT09IHRoaXMudmVyc2lvblxuICAgICk7XG5cbiAgICBpZiAodGhpcy5oZWF0bWFwT3B0aW9uID09PSAnY291bnQnKSB7XG4gICAgICB0aGlzLmxvYWRQcm9jZXNzRGVmaW5pdGlvbkhlYXRtYXBDb3VudCh0aGlzLnByb2Nlc3NEZWZpbml0aW9uKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaGVhdG1hcE9wdGlvbiA9PT0gJ2R1cmF0aW9uJykge1xuICAgICAgdGhpcy5sb2FkUHJvY2Vzc0RlZmluaXRpb25IZWF0bWFwRHVyYXRpb24odGhpcy5wcm9jZXNzRGVmaW5pdGlvbik7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHNldE1heChrZXk6IGFueSkge1xuICAgIGlmICh0aGlzLmhlYXRtYXBEdXJhdGlvbikge1xuICAgICAgdGhpcy5tYXggPSBNYXRoLm1heCh0aGlzLmhlYXRtYXBEdXJhdGlvbltrZXldLmF2ZXJhZ2VEdXJhdGlvbkluTWlsbGlzZWNvbmRzLCB0aGlzLm1heCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmhlYXRtYXBDb3VudCkge1xuICAgICAgdGhpcy5tYXggPSBNYXRoLm1heChcbiAgICAgICAgdGhpcy5oZWF0bWFwQ291bnRba2V5XS50b3RhbENvdW50ICsgdGhpcy5oZWF0bWFwQ291bnRba2V5XS5jb3VudCxcbiAgICAgICAgdGhpcy5tYXhcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGFkZENvdW50ZXJBY3RpdmVPdmVybGF5cyhrZXk6IGFueSwgaW5wdXREYXRhOiBhbnkpIHtcbiAgICBjb25zdCBvdmVybGF5cyA9IHRoaXMuYnBtbkpTLmdldCgnb3ZlcmxheXMnKTtcbiAgICBvdmVybGF5cy5hZGQoa2V5LCB7XG4gICAgICBwb3NpdGlvbjoge1xuICAgICAgICBib3R0b206IDEzLFxuICAgICAgICBsZWZ0OiAtMTIsXG4gICAgICB9LFxuICAgICAgc2hvdzoge1xuICAgICAgICBtaW5ab29tOiAwLFxuICAgICAgICBtYXhab29tOiA1LjAsXG4gICAgICB9LFxuICAgICAgaHRtbDogYDxzcGFuIGNsYXNzPVwiYmFkZ2UgYmFkZ2UtcGlsbCBiYWRnZS1wcmltYXJ5XCI+JHtpbnB1dERhdGFba2V5XS5jb3VudH08L3NwYW4+YCxcbiAgICB9KTtcbiAgfVxufVxuIl19