@libs-ui/services-diagram-draw 0.2.356-37
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 +279 -0
- package/canvas.service.d.ts +42 -0
- package/diagram-draw.service.d.ts +91 -0
- package/direction.service.d.ts +43 -0
- package/esm2022/canvas.service.mjs +628 -0
- package/esm2022/diagram-draw.service.mjs +711 -0
- package/esm2022/direction.service.mjs +255 -0
- package/esm2022/index.mjs +6 -0
- package/esm2022/interfaces/canvas.interface.mjs +2 -0
- package/esm2022/interfaces/coordinates.interface.mjs +2 -0
- package/esm2022/interfaces/diagram.interface.mjs +2 -0
- package/esm2022/libs-ui-services-diagram-draw.mjs +5 -0
- package/esm2022/utils/calculator-branch.util.mjs +187 -0
- package/esm2022/utils/calculator-element.util.mjs +335 -0
- package/esm2022/utils/canvas.util.mjs +176 -0
- package/esm2022/utils/diagram.util.mjs +54 -0
- package/esm2022/utils/direction.util.mjs +103 -0
- package/esm2022/utils/horizontal/calculator-branch.util.mjs +243 -0
- package/esm2022/utils/horizontal/calculator-coordinates.util.mjs +315 -0
- package/fesm2022/libs-ui-services-diagram-draw.mjs +2982 -0
- package/fesm2022/libs-ui-services-diagram-draw.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/interfaces/canvas.interface.d.ts +21 -0
- package/interfaces/coordinates.interface.d.ts +40 -0
- package/interfaces/diagram.interface.d.ts +109 -0
- package/package.json +27 -0
- package/utils/calculator-branch.util.d.ts +16 -0
- package/utils/calculator-element.util.d.ts +24 -0
- package/utils/canvas.util.d.ts +21 -0
- package/utils/diagram.util.d.ts +6 -0
- package/utils/direction.util.d.ts +6 -0
- package/utils/horizontal/calculator-branch.util.d.ts +67 -0
- package/utils/horizontal/calculator-coordinates.util.d.ts +42 -0
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { canvasConfigReadonly } from '../diagram-draw.service';
|
|
2
|
+
export const buildFlatElement = (elements, flatElementsContainer) => {
|
|
3
|
+
elements.forEach((element) => {
|
|
4
|
+
flatElementsContainer.push(element);
|
|
5
|
+
if (!element.branches || !element.branches.length) {
|
|
6
|
+
return;
|
|
7
|
+
}
|
|
8
|
+
flatElementHasBranch(element, flatElementsContainer);
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
const flatElementHasBranch = (element, flatElementsContainer) => {
|
|
12
|
+
if (!element.branches || !element.branches.length) {
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
element.branches.forEach((branch) => {
|
|
16
|
+
if (!branch.elements || !branch.elements.length) {
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
buildFlatElement(branch.elements, flatElementsContainer);
|
|
20
|
+
});
|
|
21
|
+
};
|
|
22
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
23
|
+
export const setAttributeSvgAndAppend = (svgElement, elementSvg, svgAttributePathD, color) => {
|
|
24
|
+
elementSvg?.setAttribute('d', svgAttributePathD);
|
|
25
|
+
elementSvg?.setAttribute('stroke', `#${color ?? canvasConfigReadonly().ELEMENT_SVG_STROKE_COLOR}`);
|
|
26
|
+
elementSvg?.setAttribute('fill', 'none');
|
|
27
|
+
elementSvg?.setAttribute('stroke-width', canvasConfigReadonly().ELEMENT_SVG_STROKE_WIDTH);
|
|
28
|
+
svgElement?.nativeElement.appendChild(elementSvg);
|
|
29
|
+
};
|
|
30
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
31
|
+
export const canvasRemoveChildInSvg = (svgElement) => {
|
|
32
|
+
if (!svgElement) {
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
const children = Array.from(svgElement?.nativeElement.children);
|
|
36
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
37
|
+
children.forEach((child) => {
|
|
38
|
+
if (child.tagName !== 'path') {
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
child.remove();
|
|
42
|
+
});
|
|
43
|
+
};
|
|
44
|
+
export const applyElementStyle = (el, element) => {
|
|
45
|
+
el.style.position = 'absolute';
|
|
46
|
+
el.style.top = '0';
|
|
47
|
+
el.style.left = '0';
|
|
48
|
+
el.style.transform = `translate(${element.translateX}px, ${element.translateY}px)`;
|
|
49
|
+
el.style.width = `${element.specific_width}px`;
|
|
50
|
+
el.style.height = `${element.specific_height}px`;
|
|
51
|
+
el.style.zIndex = '1';
|
|
52
|
+
el.style.willChange = 'transform';
|
|
53
|
+
};
|
|
54
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlhZ3JhbS51dGlsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9zZXJ2aWNlcy9kaWFncmFtLWRyYXcvc3JjL3V0aWxzL2RpYWdyYW0udXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUcvRCxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLFFBQWdDLEVBQUUscUJBQTZDLEVBQUUsRUFBRTtJQUNsSCxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7UUFDM0IscUJBQXFCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNsRCxPQUFPO1FBQ1QsQ0FBQztRQUNELG9CQUFvQixDQUFDLE9BQU8sRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO0lBQ3ZELENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDO0FBRUYsTUFBTSxvQkFBb0IsR0FBRyxDQUFDLE9BQXdCLEVBQUUscUJBQTZDLEVBQUUsRUFBRTtJQUN2RyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDbEQsT0FBTztJQUNULENBQUM7SUFDRCxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1FBQ2xDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNoRCxPQUFPO1FBQ1QsQ0FBQztRQUNELGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxRQUE2QixFQUFFLHFCQUFxQixDQUFDLENBQUM7SUFDaEYsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUM7QUFFRiw4REFBOEQ7QUFDOUQsTUFBTSxDQUFDLE1BQU0sd0JBQXdCLEdBQUcsQ0FBQyxVQUF1QyxFQUFFLFVBQXNDLEVBQUUsaUJBQXlCLEVBQUUsS0FBYyxFQUFFLEVBQUU7SUFDckssVUFBVSxFQUFFLFlBQVksQ0FBQyxHQUFHLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztJQUNqRCxVQUFVLEVBQUUsWUFBWSxDQUFDLFFBQVEsRUFBRSxJQUFJLEtBQUssSUFBSSxvQkFBb0IsRUFBRSxDQUFDLHdCQUF3QixFQUFFLENBQUMsQ0FBQztJQUNuRyxVQUFVLEVBQUUsWUFBWSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztJQUN6QyxVQUFVLEVBQUUsWUFBWSxDQUFDLGNBQWMsRUFBRSxvQkFBb0IsRUFBRSxDQUFDLHdCQUF3QixDQUFDLENBQUM7SUFDMUYsVUFBVSxFQUFFLGFBQWEsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDcEQsQ0FBQyxDQUFDO0FBRUYsOERBQThEO0FBQzlELE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLENBQUMsVUFBdUMsRUFBRSxFQUFFO0lBQ2hGLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNoQixPQUFPO0lBQ1QsQ0FBQztJQUNELE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUVoRSw4REFBOEQ7SUFDOUQsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQVUsRUFBRSxFQUFFO1FBQzlCLElBQUksS0FBSyxDQUFDLE9BQU8sS0FBSyxNQUFNLEVBQUUsQ0FBQztZQUM3QixPQUFPO1FBQ1QsQ0FBQztRQUNELEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUNqQixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHLENBQUMsRUFBZSxFQUFFLE9BQXdCLEVBQUUsRUFBRTtJQUM3RSxFQUFFLENBQUMsS0FBSyxDQUFDLFFBQVEsR0FBRyxVQUFVLENBQUM7SUFDL0IsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO0lBQ25CLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQztJQUNwQixFQUFFLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxhQUFhLE9BQU8sQ0FBQyxVQUFVLE9BQU8sT0FBTyxDQUFDLFVBQVUsS0FBSyxDQUFDO0lBQ25GLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLEdBQUcsT0FBTyxDQUFDLGNBQWMsSUFBSSxDQUFDO0lBQy9DLEVBQUUsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLGVBQWUsSUFBSSxDQUFDO0lBQ2pELEVBQUUsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQztJQUN0QixFQUFFLENBQUMsS0FBSyxDQUFDLFVBQVUsR0FBRyxXQUFXLENBQUM7QUFDcEMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRWxlbWVudFJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgY2FudmFzQ29uZmlnUmVhZG9ubHkgfSBmcm9tICcuLi9kaWFncmFtLWRyYXcuc2VydmljZSc7XG5pbXBvcnQgeyBJRGlhZ3JhbUVsZW1lbnQgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2RpYWdyYW0uaW50ZXJmYWNlJztcblxuZXhwb3J0IGNvbnN0IGJ1aWxkRmxhdEVsZW1lbnQgPSAoZWxlbWVudHM6IEFycmF5PElEaWFncmFtRWxlbWVudD4sIGZsYXRFbGVtZW50c0NvbnRhaW5lcjogQXJyYXk8SURpYWdyYW1FbGVtZW50PikgPT4ge1xuICBlbGVtZW50cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgZmxhdEVsZW1lbnRzQ29udGFpbmVyLnB1c2goZWxlbWVudCk7XG4gICAgaWYgKCFlbGVtZW50LmJyYW5jaGVzIHx8ICFlbGVtZW50LmJyYW5jaGVzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmbGF0RWxlbWVudEhhc0JyYW5jaChlbGVtZW50LCBmbGF0RWxlbWVudHNDb250YWluZXIpO1xuICB9KTtcbn07XG5cbmNvbnN0IGZsYXRFbGVtZW50SGFzQnJhbmNoID0gKGVsZW1lbnQ6IElEaWFncmFtRWxlbWVudCwgZmxhdEVsZW1lbnRzQ29udGFpbmVyOiBBcnJheTxJRGlhZ3JhbUVsZW1lbnQ+KSA9PiB7XG4gIGlmICghZWxlbWVudC5icmFuY2hlcyB8fCAhZWxlbWVudC5icmFuY2hlcy5sZW5ndGgpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgZWxlbWVudC5icmFuY2hlcy5mb3JFYWNoKChicmFuY2gpID0+IHtcbiAgICBpZiAoIWJyYW5jaC5lbGVtZW50cyB8fCAhYnJhbmNoLmVsZW1lbnRzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBidWlsZEZsYXRFbGVtZW50KGJyYW5jaC5lbGVtZW50cyBhcyBJRGlhZ3JhbUVsZW1lbnRbXSwgZmxhdEVsZW1lbnRzQ29udGFpbmVyKTtcbiAgfSk7XG59O1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IGNvbnN0IHNldEF0dHJpYnV0ZVN2Z0FuZEFwcGVuZCA9IChzdmdFbGVtZW50OiBFbGVtZW50UmVmPGFueT4gfCB1bmRlZmluZWQsIGVsZW1lbnRTdmc6IFNWR1BhdGhFbGVtZW50IHwgdW5kZWZpbmVkLCBzdmdBdHRyaWJ1dGVQYXRoRDogc3RyaW5nLCBjb2xvcj86IHN0cmluZykgPT4ge1xuICBlbGVtZW50U3ZnPy5zZXRBdHRyaWJ1dGUoJ2QnLCBzdmdBdHRyaWJ1dGVQYXRoRCk7XG4gIGVsZW1lbnRTdmc/LnNldEF0dHJpYnV0ZSgnc3Ryb2tlJywgYCMke2NvbG9yID8/IGNhbnZhc0NvbmZpZ1JlYWRvbmx5KCkuRUxFTUVOVF9TVkdfU1RST0tFX0NPTE9SfWApO1xuICBlbGVtZW50U3ZnPy5zZXRBdHRyaWJ1dGUoJ2ZpbGwnLCAnbm9uZScpO1xuICBlbGVtZW50U3ZnPy5zZXRBdHRyaWJ1dGUoJ3N0cm9rZS13aWR0aCcsIGNhbnZhc0NvbmZpZ1JlYWRvbmx5KCkuRUxFTUVOVF9TVkdfU1RST0tFX1dJRFRIKTtcbiAgc3ZnRWxlbWVudD8ubmF0aXZlRWxlbWVudC5hcHBlbmRDaGlsZChlbGVtZW50U3ZnKTtcbn07XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5leHBvcnQgY29uc3QgY2FudmFzUmVtb3ZlQ2hpbGRJblN2ZyA9IChzdmdFbGVtZW50OiBFbGVtZW50UmVmPGFueT4gfCB1bmRlZmluZWQpID0+IHtcbiAgaWYgKCFzdmdFbGVtZW50KSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IGNoaWxkcmVuID0gQXJyYXkuZnJvbShzdmdFbGVtZW50Py5uYXRpdmVFbGVtZW50LmNoaWxkcmVuKTtcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBjaGlsZHJlbi5mb3JFYWNoKChjaGlsZDogYW55KSA9PiB7XG4gICAgaWYgKGNoaWxkLnRhZ05hbWUgIT09ICdwYXRoJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjaGlsZC5yZW1vdmUoKTtcbiAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgYXBwbHlFbGVtZW50U3R5bGUgPSAoZWw6IEhUTUxFbGVtZW50LCBlbGVtZW50OiBJRGlhZ3JhbUVsZW1lbnQpID0+IHtcbiAgZWwuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICBlbC5zdHlsZS50b3AgPSAnMCc7XG4gIGVsLnN0eWxlLmxlZnQgPSAnMCc7XG4gIGVsLnN0eWxlLnRyYW5zZm9ybSA9IGB0cmFuc2xhdGUoJHtlbGVtZW50LnRyYW5zbGF0ZVh9cHgsICR7ZWxlbWVudC50cmFuc2xhdGVZfXB4KWA7XG4gIGVsLnN0eWxlLndpZHRoID0gYCR7ZWxlbWVudC5zcGVjaWZpY193aWR0aH1weGA7XG4gIGVsLnN0eWxlLmhlaWdodCA9IGAke2VsZW1lbnQuc3BlY2lmaWNfaGVpZ2h0fXB4YDtcbiAgZWwuc3R5bGUuekluZGV4ID0gJzEnO1xuICBlbC5zdHlsZS53aWxsQ2hhbmdlID0gJ3RyYW5zZm9ybSc7XG59O1xuIl19
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { cloneDeep } from '@libs-ui/utils';
|
|
2
|
+
import { canvasConfigReadonly } from '../diagram-draw.service';
|
|
3
|
+
import { buildFlatElement } from './diagram.util';
|
|
4
|
+
export const buildElementDirectionTo = (element, flatElements, checkRule, branch) => {
|
|
5
|
+
let elementsFlat = cloneDeep(flatElements) ?? [];
|
|
6
|
+
if (element.element_type === canvasConfigReadonly().TYPE_ELEMENT_WORKFLOW) {
|
|
7
|
+
if (!branch) {
|
|
8
|
+
return undefined;
|
|
9
|
+
}
|
|
10
|
+
getAllItemPreOfElement(element, elementsFlat);
|
|
11
|
+
getAllItemNextOfBranch(branch, elementsFlat);
|
|
12
|
+
elementsFlat = elementsFlat.filter((item) => item.id !== element.id && item.code !== canvasConfigReadonly().TYPE_ELEMENT_EXIT);
|
|
13
|
+
if (element.pre_other_id?.length) {
|
|
14
|
+
elementsFlat = elementsFlat.filter((item) => !element.pre_other_id?.includes(item.id ?? ''));
|
|
15
|
+
}
|
|
16
|
+
elementsFlat = elementsFlat.filter((item) => {
|
|
17
|
+
return checkRule(element, item);
|
|
18
|
+
});
|
|
19
|
+
return elementsFlat;
|
|
20
|
+
}
|
|
21
|
+
getAllItemPreOfElement(element, elementsFlat);
|
|
22
|
+
getAllItemNextOfElement(element, elementsFlat);
|
|
23
|
+
elementsFlat = elementsFlat.filter((item) => item.id !== element.id && item.code !== canvasConfigReadonly().TYPE_ELEMENT_EXIT);
|
|
24
|
+
if (element.pre_other_id?.length) {
|
|
25
|
+
elementsFlat = elementsFlat.filter((item) => !element.pre_other_id?.includes(item.id ?? ''));
|
|
26
|
+
}
|
|
27
|
+
elementsFlat = elementsFlat.filter((item) => {
|
|
28
|
+
return checkRule(element, item);
|
|
29
|
+
});
|
|
30
|
+
return elementsFlat;
|
|
31
|
+
};
|
|
32
|
+
export const getAllItemPreOfElement = (element, flatElements) => {
|
|
33
|
+
const pre_id = [];
|
|
34
|
+
if (element.pre_id) {
|
|
35
|
+
pre_id.push(element.pre_id);
|
|
36
|
+
}
|
|
37
|
+
if (element.pre_other_id) {
|
|
38
|
+
pre_id.push(...element.pre_other_id);
|
|
39
|
+
}
|
|
40
|
+
if (!pre_id.length) {
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
pre_id.forEach((preId) => {
|
|
44
|
+
const elementPre = flatElements.find((item) => item.id === preId);
|
|
45
|
+
if (!elementPre) {
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
const itemIndex = flatElements.findIndex((item) => item.id === preId);
|
|
49
|
+
flatElements.splice(itemIndex, 1);
|
|
50
|
+
getAllItemPreOfElement(elementPre, flatElements);
|
|
51
|
+
});
|
|
52
|
+
};
|
|
53
|
+
export const getAllItemNextOfElement = (element, flatElements) => {
|
|
54
|
+
if (!element.next_id) {
|
|
55
|
+
if (!element.branches || !element.branches.length) {
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
const flatElementInElementCurrent = [];
|
|
59
|
+
buildFlatElement([element], flatElementInElementCurrent);
|
|
60
|
+
flatElementInElementCurrent.forEach((el) => {
|
|
61
|
+
const itemIndex = flatElements.findIndex((item) => item.id === el.id);
|
|
62
|
+
if (itemIndex === -1) {
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
flatElements.splice(itemIndex, 1);
|
|
66
|
+
});
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
const elementNextIndex = flatElements.findIndex((item) => item.id === element.next_id);
|
|
70
|
+
if (elementNextIndex === -1) {
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
const nextElement = flatElements[elementNextIndex];
|
|
74
|
+
flatElements.splice(elementNextIndex, 1);
|
|
75
|
+
getAllItemNextOfElement(nextElement, flatElements);
|
|
76
|
+
};
|
|
77
|
+
export const getAllItemNextOfBranch = (branch, flatElements) => {
|
|
78
|
+
const flatElementInElementCurrent = [];
|
|
79
|
+
buildFlatElement(branch.elements, flatElementInElementCurrent);
|
|
80
|
+
flatElementInElementCurrent.forEach((el) => {
|
|
81
|
+
const itemIndex = flatElements.findIndex((item) => item.id === el.id);
|
|
82
|
+
if (itemIndex === -1) {
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
flatElements.splice(itemIndex, 1);
|
|
86
|
+
});
|
|
87
|
+
};
|
|
88
|
+
export const collectNextChainElements = (element, flatContainerElement, listElementDelete) => {
|
|
89
|
+
const elementNext = flatContainerElement.find((item) => item.id === element.next_id);
|
|
90
|
+
if (!elementNext) {
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
const flatElementInElementCurrent = [];
|
|
94
|
+
buildFlatElement([elementNext], flatElementInElementCurrent);
|
|
95
|
+
flatElementInElementCurrent.forEach((el) => {
|
|
96
|
+
const itemInNext = flatContainerElement.find((item) => item.id === el.id);
|
|
97
|
+
if (itemInNext) {
|
|
98
|
+
listElementDelete.push(itemInNext);
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
collectNextChainElements(elementNext, flatContainerElement, listElementDelete);
|
|
102
|
+
};
|
|
103
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlyZWN0aW9uLnV0aWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzLXVpL3NlcnZpY2VzL2RpYWdyYW0tZHJhdy9zcmMvdXRpbHMvZGlyZWN0aW9uLnV0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRS9ELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRWxELE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFHLENBQUMsT0FBd0IsRUFBRSxZQUErQixFQUFFLFNBQXVFLEVBQUUsTUFBOEIsRUFBRSxFQUFFO0lBQzVNLElBQUksWUFBWSxHQUFzQixTQUFTLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDO0lBRXBFLElBQUksT0FBTyxDQUFDLFlBQVksS0FBSyxvQkFBb0IsRUFBRSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDMUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ1osT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztRQUVELHNCQUFzQixDQUFDLE9BQU8sRUFBRSxZQUFZLENBQUMsQ0FBQztRQUM5QyxzQkFBc0IsQ0FBQyxNQUFNLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDN0MsWUFBWSxHQUFHLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssT0FBTyxDQUFDLEVBQUUsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLG9CQUFvQixFQUFFLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUMvSCxJQUFJLE9BQU8sQ0FBQyxZQUFZLEVBQUUsTUFBTSxFQUFFLENBQUM7WUFDakMsWUFBWSxHQUFHLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxJ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O0lBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDSCx3QkFBd0IsQ0FBQyxXQUFXLEVBQUUsb0JBQW9CLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztBQUNqRixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjbG9uZURlZXAgfSBmcm9tICdAbGlicy11aS91dGlscyc7XG5pbXBvcnQgeyBjYW52YXNDb25maWdSZWFkb25seSB9IGZyb20gJy4uL2RpYWdyYW0tZHJhdy5zZXJ2aWNlJztcbmltcG9ydCB7IElEaWFncmFtRWxlbWVudCwgSURpYWdyYW1FbGVtZW50QnJhbmNoIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9kaWFncmFtLmludGVyZmFjZSc7XG5pbXBvcnQgeyBidWlsZEZsYXRFbGVtZW50IH0gZnJvbSAnLi9kaWFncmFtLnV0aWwnO1xuXG5leHBvcnQgY29uc3QgYnVpbGRFbGVtZW50RGlyZWN0aW9uVG8gPSAoZWxlbWVudDogSURpYWdyYW1FbGVtZW50LCBmbGF0RWxlbWVudHM6IElEaWFncmFtRWxlbWVudFtdLCBjaGVja1J1bGU6IChlbGVtZW50OiBJRGlhZ3JhbUVsZW1lbnQsIGl0ZW06IElEaWFncmFtRWxlbWVudCkgPT4gYm9vbGVhbiwgYnJhbmNoPzogSURpYWdyYW1FbGVtZW50QnJhbmNoKSA9PiB7XG4gIGxldCBlbGVtZW50c0ZsYXQ6IElEaWFncmFtRWxlbWVudFtdID0gY2xvbmVEZWVwKGZsYXRFbGVtZW50cykgPz8gW107XG5cbiAgaWYgKGVsZW1lbnQuZWxlbWVudF90eXBlID09PSBjYW52YXNDb25maWdSZWFkb25seSgpLlRZUEVfRUxFTUVOVF9XT1JLRkxPVykge1xuICAgIGlmICghYnJhbmNoKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGdldEFsbEl0ZW1QcmVPZkVsZW1lbnQoZWxlbWVudCwgZWxlbWVudHNGbGF0KTtcbiAgICBnZXRBbGxJdGVtTmV4dE9mQnJhbmNoKGJyYW5jaCwgZWxlbWVudHNGbGF0KTtcbiAgICBlbGVtZW50c0ZsYXQgPSBlbGVtZW50c0ZsYXQuZmlsdGVyKChpdGVtKSA9PiBpdGVtLmlkICE9PSBlbGVtZW50LmlkICYmIGl0ZW0uY29kZSAhPT0gY2FudmFzQ29uZmlnUmVhZG9ubHkoKS5UWVBFX0VMRU1FTlRfRVhJVCk7XG4gICAgaWYgKGVsZW1lbnQucHJlX290aGVyX2lkPy5sZW5ndGgpIHtcbiAgICAgIGVsZW1lbnRzRmxhdCA9IGVsZW1lbnRzRmxhdC5maWx0ZXIoKGl0ZW0pID0+ICFlbGVtZW50LnByZV9vdGhlcl9pZD8uaW5jbHVkZXMoaXRlbS5pZCA/PyAnJykpO1xuICAgIH1cbiAgICBlbGVtZW50c0ZsYXQgPSBlbGVtZW50c0ZsYXQuZmlsdGVyKChpdGVtKSA9PiB7XG4gICAgICByZXR1cm4gY2hlY2tSdWxlKGVsZW1lbnQsIGl0ZW0pO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGVsZW1lbnRzRmxhdDtcbiAgfVxuXG4gIGdldEFsbEl0ZW1QcmVPZkVsZW1lbnQoZWxlbWVudCwgZWxlbWVudHNGbGF0KTtcbiAgZ2V0QWxsSXRlbU5leHRPZkVsZW1lbnQoZWxlbWVudCwgZWxlbWVudHNGbGF0KTtcbiAgZWxlbWVudHNGbGF0ID0gZWxlbWVudHNGbGF0LmZpbHRlcigoaXRlbSkgPT4gaXRlbS5pZCAhPT0gZWxlbWVudC5pZCAmJiBpdGVtLmNvZGUgIT09IGNhbnZhc0NvbmZpZ1JlYWRvbmx5KCkuVFlQRV9FTEVNRU5UX0VYSVQpO1xuXG4gIGlmIChlbGVtZW50LnByZV9vdGhlcl9pZD8ubGVuZ3RoKSB7XG4gICAgZWxlbWVudHNGbGF0ID0gZWxlbWVudHNGbGF0LmZpbHRlcigoaXRlbSkgPT4gIWVsZW1lbnQucHJlX290aGVyX2lkPy5pbmNsdWRlcyhpdGVtLmlkID8/ICcnKSk7XG4gIH1cblxuICBlbGVtZW50c0ZsYXQgPSBlbGVtZW50c0ZsYXQuZmlsdGVyKChpdGVtKSA9PiB7XG4gICAgcmV0dXJuIGNoZWNrUnVsZShlbGVtZW50LCBpdGVtKTtcbiAgfSk7XG5cbiAgcmV0dXJuIGVsZW1lbnRzRmxhdDtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRBbGxJdGVtUHJlT2ZFbGVtZW50ID0gKGVsZW1lbnQ6IElEaWFncmFtRWxlbWVudCwgZmxhdEVsZW1lbnRzOiBJRGlhZ3JhbUVsZW1lbnRbXSkgPT4ge1xuICBjb25zdCBwcmVfaWQgPSBbXTtcblxuICBpZiAoZWxlbWVudC5wcmVfaWQpIHtcbiAgICBwcmVfaWQucHVzaChlbGVtZW50LnByZV9pZCk7XG4gIH1cbiAgaWYgKGVsZW1lbnQucHJlX290aGVyX2lkKSB7XG4gICAgcHJlX2lkLnB1c2goLi4uZWxlbWVudC5wcmVfb3RoZXJfaWQpO1xuICB9XG4gIGlmICghcHJlX2lkLmxlbmd0aCkge1xuICAgIHJldHVybjtcbiAgfVxuICBwcmVfaWQuZm9yRWFjaCgocHJlSWQpID0+IHtcbiAgICBjb25zdCBlbGVtZW50UHJlID0gZmxhdEVsZW1lbnRzLmZpbmQoKGl0ZW0pID0+IGl0ZW0uaWQgPT09IHByZUlkKTtcblxuICAgIGlmICghZWxlbWVudFByZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpdGVtSW5kZXggPSBmbGF0RWxlbWVudHMuZmluZEluZGV4KChpdGVtKSA9PiBpdGVtLmlkID09PSBwcmVJZCk7XG5cbiAgICBmbGF0RWxlbWVudHMuc3BsaWNlKGl0ZW1JbmRleCwgMSk7XG4gICAgZ2V0QWxsSXRlbVByZU9mRWxlbWVudChlbGVtZW50UHJlLCBmbGF0RWxlbWVudHMpO1xuICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRBbGxJdGVtTmV4dE9mRWxlbWVudCA9IChlbGVtZW50OiBJRGlhZ3JhbUVsZW1lbnQsIGZsYXRFbGVtZW50czogSURpYWdyYW1FbGVtZW50W10pID0+IHtcbiAgaWYgKCFlbGVtZW50Lm5leHRfaWQpIHtcbiAgICBpZiAoIWVsZW1lbnQuYnJhbmNoZXMgfHwgIWVsZW1lbnQuYnJhbmNoZXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZmxhdEVsZW1lbnRJbkVsZW1lbnRDdXJyZW50OiBJRGlhZ3JhbUVsZW1lbnRbXSA9IFtdO1xuXG4gICAgYnVpbGRGbGF0RWxlbWVudChbZWxlbWVudF0sIGZsYXRFbGVtZW50SW5FbGVtZW50Q3VycmVudCk7XG4gICAgZmxhdEVsZW1lbnRJbkVsZW1lbnRDdXJyZW50LmZvckVhY2goKGVsKSA9PiB7XG4gICAgICBjb25zdCBpdGVtSW5kZXggPSBmbGF0RWxlbWVudHMuZmluZEluZGV4KChpdGVtKSA9PiBpdGVtLmlkID09PSBlbC5pZCk7XG5cbiAgICAgIGlmIChpdGVtSW5kZXggPT09IC0xKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgZmxhdEVsZW1lbnRzLnNwbGljZShpdGVtSW5kZXgsIDEpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IGVsZW1lbnROZXh0SW5kZXggPSBmbGF0RWxlbWVudHMuZmluZEluZGV4KChpdGVtKSA9PiBpdGVtLmlkID09PSBlbGVtZW50Lm5leHRfaWQpO1xuXG4gIGlmIChlbGVtZW50TmV4dEluZGV4ID09PSAtMSkge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBuZXh0RWxlbWVudCA9IGZsYXRFbGVtZW50c1tlbGVtZW50TmV4dEluZGV4XTtcblxuICBmbGF0RWxlbWVudHMuc3BsaWNlKGVsZW1lbnROZXh0SW5kZXgsIDEpO1xuICBnZXRBbGxJdGVtTmV4dE9mRWxlbWVudChuZXh0RWxlbWVudCwgZmxhdEVsZW1lbnRzKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRBbGxJdGVtTmV4dE9mQnJhbmNoID0gKGJyYW5jaDogSURpYWdyYW1FbGVtZW50QnJhbmNoLCBmbGF0RWxlbWVudHM6IElEaWFncmFtRWxlbWVudFtdKSA9PiB7XG4gIGNvbnN0IGZsYXRFbGVtZW50SW5FbGVtZW50Q3VycmVudDogSURpYWdyYW1FbGVtZW50W10gPSBbXTtcblxuICBidWlsZEZsYXRFbGVtZW50KGJyYW5jaC5lbGVtZW50cywgZmxhdEVsZW1lbnRJbkVsZW1lbnRDdXJyZW50KTtcbiAgZmxhdEVsZW1lbnRJbkVsZW1lbnRDdXJyZW50LmZvckVhY2goKGVsKSA9PiB7XG4gICAgY29uc3QgaXRlbUluZGV4ID0gZmxhdEVsZW1lbnRzLmZpbmRJbmRleCgoaXRlbSkgPT4gaXRlbS5pZCA9PT0gZWwuaWQpO1xuXG4gICAgaWYgKGl0ZW1JbmRleCA9PT0gLTEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmbGF0RWxlbWVudHMuc3BsaWNlKGl0ZW1JbmRleCwgMSk7XG4gIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGNvbGxlY3ROZXh0Q2hhaW5FbGVtZW50cyA9IChlbGVtZW50OiBJRGlhZ3JhbUVsZW1lbnQsIGZsYXRDb250YWluZXJFbGVtZW50OiBJRGlhZ3JhbUVsZW1lbnRbXSwgbGlzdEVsZW1lbnREZWxldGU6IElEaWFncmFtRWxlbWVudFtdKSA9PiB7XG4gIGNvbnN0IGVsZW1lbnROZXh0ID0gZmxhdENvbnRhaW5lckVsZW1lbnQuZmluZCgoaXRlbSkgPT4gaXRlbS5pZCA9PT0gZWxlbWVudC5uZXh0X2lkKTtcblxuICBpZiAoIWVsZW1lbnROZXh0KSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IGZsYXRFbGVtZW50SW5FbGVtZW50Q3VycmVudDogSURpYWdyYW1FbGVtZW50W10gPSBbXTtcblxuICBidWlsZEZsYXRFbGVtZW50KFtlbGVtZW50TmV4dF0sIGZsYXRFbGVtZW50SW5FbGVtZW50Q3VycmVudCk7XG4gIGZsYXRFbGVtZW50SW5FbGVtZW50Q3VycmVudC5mb3JFYWNoKChlbCkgPT4ge1xuICAgIGNvbnN0IGl0ZW1Jbk5leHQgPSBmbGF0Q29udGFpbmVyRWxlbWVudC5maW5kKChpdGVtKSA9PiBpdGVtLmlkID09PSBlbC5pZCk7XG5cbiAgICBpZiAoaXRlbUluTmV4dCkge1xuICAgICAgbGlzdEVsZW1lbnREZWxldGUucHVzaChpdGVtSW5OZXh0KTtcbiAgICB9XG4gIH0pO1xuICBjb2xsZWN0TmV4dENoYWluRWxlbWVudHMoZWxlbWVudE5leHQsIGZsYXRDb250YWluZXJFbGVtZW50LCBsaXN0RWxlbWVudERlbGV0ZSk7XG59O1xuIl19
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
import { canvasConfigReadonly } from '../../diagram-draw.service';
|
|
2
|
+
import { checkMaxTop } from '../calculator-element.util';
|
|
3
|
+
import { getHeightWaitConfig } from '../calculator-element.util';
|
|
4
|
+
import { MoLibDiagramHorizontalCalculatorCoordinatesUtil } from './calculator-coordinates.util';
|
|
5
|
+
/**
|
|
6
|
+
* Horizontal branch calculator.
|
|
7
|
+
* Flow direction: LEFT → RIGHT (trái sang phải).
|
|
8
|
+
* Branches spread: above = UP (y giảm), under = DOWN (y tăng).
|
|
9
|
+
*
|
|
10
|
+
* Mapping từ trục dọc sang ngang:
|
|
11
|
+
* vertical "left" branch (x giảm) ↔ horizontal "above" branch (y giảm)
|
|
12
|
+
* vertical "right" branch (x tăng) ↔ horizontal "under" branch (y tăng)
|
|
13
|
+
*
|
|
14
|
+
* Ký hiệu trong ICoordinatesDiagramSvg:
|
|
15
|
+
* (mx,my) = điểm bắt đầu Q curve
|
|
16
|
+
* (x1,y1) = control point
|
|
17
|
+
* (x,y) = end point của Q curve
|
|
18
|
+
* (lx,ly) = điểm cuối của L sau Q
|
|
19
|
+
*/
|
|
20
|
+
export class MoLibDiagramHorizontalCalculatorBranchUtil {
|
|
21
|
+
static getHorizontalDistanceToFirstBlock(branch) {
|
|
22
|
+
if (branch.nodeOtherConfig) {
|
|
23
|
+
const distToWait = 110; // increase statically since branch label is always assigned later
|
|
24
|
+
return distToWait + getHeightWaitConfig(branch.nodeOtherConfig) + canvasConfigReadonly().WAIT_TO_ELEMENT;
|
|
25
|
+
}
|
|
26
|
+
return canvasConfigReadonly().ELEMENT_MARGIN_DEFAULT_BRANCH_TO_ELEMENT_FIRST;
|
|
27
|
+
}
|
|
28
|
+
// ─────────────────────────────────────────────────────────────────── public ──
|
|
29
|
+
/** Nhánh giữa (center): kéo thẳng sang phải */
|
|
30
|
+
static drawStraightLine(top, // Y tâm của element cha
|
|
31
|
+
lineFormElementToBranching, // width element + margin đến điểm rẽ
|
|
32
|
+
left, // X trái của element cha
|
|
33
|
+
branch, maxWidthBranch, config) {
|
|
34
|
+
branch.onTheSide = 'center';
|
|
35
|
+
const startDraw = left + lineFormElementToBranching;
|
|
36
|
+
let Lx = startDraw;
|
|
37
|
+
Lx += canvasConfigReadonly().ELEMENT_HEIGHT_CURVE;
|
|
38
|
+
Lx += this.getHorizontalDistanceToFirstBlock(branch);
|
|
39
|
+
if (!branch.elements || !branch.elements.length) {
|
|
40
|
+
Lx += maxWidthBranch + 20;
|
|
41
|
+
}
|
|
42
|
+
const coord1 = { mx: left, my: top, lx: Lx, ly: top };
|
|
43
|
+
branch.attributeSvgD = `M ${coord1.mx} ${coord1.my} L ${coord1.lx} ${coord1.ly}`;
|
|
44
|
+
if (branch.nodeOtherConfig) {
|
|
45
|
+
const distToWait = 110;
|
|
46
|
+
const endXToWait = startDraw + canvasConfigReadonly().ELEMENT_HEIGHT_CURVE + distToWait;
|
|
47
|
+
branch.attributeSvgD = `M ${coord1.mx} ${coord1.my} L ${endXToWait} ${coord1.my}`;
|
|
48
|
+
const waitWidth = getHeightWaitConfig(branch.nodeOtherConfig);
|
|
49
|
+
const leftLine2 = endXToWait + waitWidth;
|
|
50
|
+
delete branch.nodeOtherConfig.attributeSvgD;
|
|
51
|
+
if (branch.elements && branch.elements.length) {
|
|
52
|
+
branch.nodeOtherConfig.attributeSvgD = `M ${leftLine2} ${coord1.my} L ${coord1.lx} ${coord1.my}`;
|
|
53
|
+
}
|
|
54
|
+
branch.nodeOtherConfig.specific_x = endXToWait;
|
|
55
|
+
branch.nodeOtherConfig.specific_y = coord1.my;
|
|
56
|
+
// Đảm bảo có kích thước để setTranslatePositions tính offset đúng
|
|
57
|
+
if (!branch.nodeOtherConfig.specific_height) {
|
|
58
|
+
branch.nodeOtherConfig.specific_height = canvasConfigReadonly().ELEMENT_WAIT_DEFAULT;
|
|
59
|
+
}
|
|
60
|
+
if (!branch.nodeOtherConfig.specific_width) {
|
|
61
|
+
branch.nodeOtherConfig.specific_width = canvasConfigReadonly().ELEMENT_WAIT_DEFAULT;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
branch.specific_start_branch_x = left + lineFormElementToBranching + canvasConfigReadonly().ELEMENT_HEIGHT_CURVE;
|
|
65
|
+
branch.specific_start_branch_y = top;
|
|
66
|
+
if (!branch.elements || !branch.elements.length)
|
|
67
|
+
return;
|
|
68
|
+
const widthToElement = canvasConfigReadonly().ELEMENT_HEIGHT_CURVE + this.getHorizontalDistanceToFirstBlock(branch);
|
|
69
|
+
branch.elements.forEach((el) => {
|
|
70
|
+
el.specific_x = left + lineFormElementToBranching + widthToElement;
|
|
71
|
+
el.specific_y = top - (el.specific_height ?? 0) / 2;
|
|
72
|
+
});
|
|
73
|
+
MoLibDiagramHorizontalCalculatorCoordinatesUtil.setXYElements(branch.elements, config);
|
|
74
|
+
}
|
|
75
|
+
/** Nhánh phía trên (above): rẽ lên, rồi bẻ phải đến element */
|
|
76
|
+
static aboveLine(top, lineFormElementToBranching, left, lineBetweenBranch, branch, maxWidthBranch, element, config) {
|
|
77
|
+
branch.onTheSide = 'above';
|
|
78
|
+
const { coordQL2, isCheckAllElementConnectToExit } = this.drawAboveUnderLine(top, lineFormElementToBranching, left, lineBetweenBranch, branch, maxWidthBranch, 'above', config);
|
|
79
|
+
branch.specific_start_branch_x = coordQL2.x;
|
|
80
|
+
branch.specific_start_branch_y = coordQL2.y;
|
|
81
|
+
if (!branch.elements || !branch.elements.length)
|
|
82
|
+
return;
|
|
83
|
+
this.drawElementInBranchLine(branch, coordQL2, config);
|
|
84
|
+
if (isCheckAllElementConnectToExit)
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
/** Nhánh phía dưới (under): rẽ xuống, rồi bẻ phải đến element */
|
|
88
|
+
static underLine(top, lineFormElementToBranching, left, lineBetweenBranch, branch, maxWidthBranch, element, config) {
|
|
89
|
+
branch.onTheSide = 'under';
|
|
90
|
+
const { coordQL1, coordQL2, isCheckAllElementConnectToExit } = this.drawAboveUnderLine(top, lineFormElementToBranching, left, lineBetweenBranch, branch, maxWidthBranch, 'under', config);
|
|
91
|
+
branch.specific_start_branch_x = coordQL2.x;
|
|
92
|
+
branch.specific_start_branch_y = coordQL2.y;
|
|
93
|
+
// Mở rộng widthSvg nếu nhánh xuống vượt
|
|
94
|
+
const maxY = (coordQL1.y ?? 0) + 200;
|
|
95
|
+
const configSvg = config.widthHeightSvgCanvas;
|
|
96
|
+
configSvg.heightSvg = maxY > configSvg.heightSvg ? maxY : configSvg.heightSvg;
|
|
97
|
+
if (!branch.elements || !branch.elements.length)
|
|
98
|
+
return;
|
|
99
|
+
this.drawElementInBranchLine(branch, coordQL2, config);
|
|
100
|
+
if (isCheckAllElementConnectToExit)
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
// ────────────────────────────────────────────────────────────────── private ──
|
|
104
|
+
/** Đặt element đầu tiên trong nhánh dựa theo tọa độ cuối của QL2 */
|
|
105
|
+
static drawElementInBranchLine(branch, coordQL2, config) {
|
|
106
|
+
const elementFirst = branch.elements[0];
|
|
107
|
+
// lx = X bắt đầu của element; ly = Y tâm nhánh → specific_y = tâm - half height
|
|
108
|
+
elementFirst.specific_x = coordQL2.lx;
|
|
109
|
+
elementFirst.specific_y = (coordQL2.ly ?? 0) - (elementFirst.specific_height ?? 0) / 2;
|
|
110
|
+
MoLibDiagramHorizontalCalculatorCoordinatesUtil.setXYElements(branch.elements, config);
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Vẽ đường rẽ nhánh kiểu horizontal:
|
|
114
|
+
*
|
|
115
|
+
* M left top → bắt đầu tại tâm Y của element cha
|
|
116
|
+
* L Lx top → kéo NGANG sang phải đến điểm rẽ (Lx = left + lineFormElementToBranching - CURVE)
|
|
117
|
+
*
|
|
118
|
+
* QL1: bẻ từ hướng → sang hướng ↑ (above) hoặc ↓ (under)
|
|
119
|
+
* M (Lx, top)
|
|
120
|
+
* Q (Lx+C, top) → (Lx+C, top±C) control đi thẳng phải, điểm kết bắt đầu đi dọc
|
|
121
|
+
* L Lx+C, top±C±straight kéo thẳng dọc (lên/xuống)
|
|
122
|
+
*
|
|
123
|
+
* QL2: bẻ ngược lại → hướng ngang để tới element
|
|
124
|
+
* Q (Lx+C, top±C±straight±C) → (Lx+2C, top±C±straight±C)
|
|
125
|
+
* control đi tiếp dọc, điểm kết đi ngang (phải)
|
|
126
|
+
* L Lx+2C+distToFirst, same_Y kéo ngang đến vị trí element đầu tiên
|
|
127
|
+
*
|
|
128
|
+
* Sau QL2:
|
|
129
|
+
* coordQL2.lx = X bắt đầu của element đầu tiên
|
|
130
|
+
* coordQL2.ly = Y tâm của nhánh
|
|
131
|
+
*/
|
|
132
|
+
static drawAboveUnderLine(top, lineFormElementToBranching, left, lineBetweenBranch, branch, maxWidthBranch, direction, config) {
|
|
133
|
+
const CURVE = canvasConfigReadonly().ELEMENT_HEIGHT_CURVE;
|
|
134
|
+
const M = `M ${left} ${top}`;
|
|
135
|
+
const Lx = left + lineFormElementToBranching - CURVE;
|
|
136
|
+
const L = `L ${Lx} ${top}`;
|
|
137
|
+
const straight = lineBetweenBranch - CURVE * 2; // đoạn thẳng dọc (bỏ 2 cong đầu-cuối)
|
|
138
|
+
// ── QL1: curve từ hướng ngang → hướng dọc (lên/xuống), rồi thẳng dọc ────
|
|
139
|
+
const coordQL1 = {
|
|
140
|
+
mx: Lx,
|
|
141
|
+
my: top,
|
|
142
|
+
x1: Lx + CURVE, // control: đi thẳng phải thêm CURVE
|
|
143
|
+
y1: top, // control: cùng Y
|
|
144
|
+
x: Lx + CURVE, // end X: giữ nguyên (= Lx+CURVE)
|
|
145
|
+
y: this.mathOp(direction, top, CURVE, true),
|
|
146
|
+
// 'above': top - CURVE (bắt đầu đi lên)
|
|
147
|
+
// 'under': top + CURVE (bắt đầu đi xuống)
|
|
148
|
+
};
|
|
149
|
+
// Đoạn L sau QL1: giữ nguyên X, tiếp tục đi dọc
|
|
150
|
+
coordQL1.lx = coordQL1.x; // X không đổi
|
|
151
|
+
coordQL1.ly = this.mathOp(direction, coordQL1.y, straight, true); // tiếp tục lên/xuống
|
|
152
|
+
const QL1 = `M ${coordQL1.mx},${coordQL1.my} Q ${coordQL1.x1},${coordQL1.y1} ${coordQL1.x},${coordQL1.y} L ${coordQL1.lx} ${coordQL1.ly}`;
|
|
153
|
+
// ── QL2: curve từ hướng dọc → hướng ngang (phải), rồi thẳng ngang đến element ──
|
|
154
|
+
const coordQL2 = {
|
|
155
|
+
// control: tiếp tục đi dọc thêm CURVE từ điểm cuối QL1
|
|
156
|
+
x1: coordQL1.lx,
|
|
157
|
+
y1: this.mathOp(direction, coordQL1.ly, CURVE, true),
|
|
158
|
+
// end: rẽ ngang sang phải thêm CURVE, giữ nguyên Y tại y1
|
|
159
|
+
y: this.mathOp(direction, coordQL1.ly, CURVE, true),
|
|
160
|
+
x: (coordQL1.lx ?? 0) + CURVE,
|
|
161
|
+
};
|
|
162
|
+
// Đoạn L sau QL2: đi ngang (phải) đến vị trí element đầu tiên trong nhánh
|
|
163
|
+
const distToFirst = this.getHorizontalDistanceToFirstBlock(branch);
|
|
164
|
+
if (!branch.elements || !branch.elements.length) {
|
|
165
|
+
coordQL2.lx = (coordQL2.x ?? 0) + distToFirst + maxWidthBranch;
|
|
166
|
+
}
|
|
167
|
+
else {
|
|
168
|
+
coordQL2.lx = (coordQL2.x ?? 0) + distToFirst;
|
|
169
|
+
}
|
|
170
|
+
coordQL2.ly = coordQL2.y; // Y không đổi → tâm Y của nhánh
|
|
171
|
+
// Xử lý nodeOtherConfig (wait block) trên nhánh
|
|
172
|
+
let QL2 = `Q ${coordQL2.x1},${coordQL2.y1} ${coordQL2.x},${coordQL2.y} L ${coordQL2.lx} ${coordQL2.ly}`;
|
|
173
|
+
if (branch.nodeOtherConfig) {
|
|
174
|
+
const distToWait = 110;
|
|
175
|
+
const endXToWait = (coordQL2.x ?? 0) + distToWait;
|
|
176
|
+
const waitWidth = getHeightWaitConfig(branch.nodeOtherConfig);
|
|
177
|
+
const leftLine2 = endXToWait + waitWidth;
|
|
178
|
+
delete branch.nodeOtherConfig.attributeSvgD;
|
|
179
|
+
QL2 = `Q ${coordQL2.x1},${coordQL2.y1} ${coordQL2.x},${coordQL2.y} M ${coordQL2.x},${coordQL2.y} L ${endXToWait},${coordQL2.y}`;
|
|
180
|
+
if (branch.elements && branch.elements.length) {
|
|
181
|
+
branch.nodeOtherConfig.attributeSvgD = `M ${leftLine2} ${coordQL2.y} L ${coordQL2.lx} ${coordQL2.ly}`;
|
|
182
|
+
}
|
|
183
|
+
branch.nodeOtherConfig.specific_x = endXToWait;
|
|
184
|
+
// specific_y = tâm Y của nhánh — setTranslatePositions sẽ trừ height/2 khi set translateY
|
|
185
|
+
branch.nodeOtherConfig.specific_y = coordQL2.y ?? 0;
|
|
186
|
+
// Đảm bảo có kích thước để setTranslatePositions tính offset đúng
|
|
187
|
+
if (!branch.nodeOtherConfig.specific_height) {
|
|
188
|
+
branch.nodeOtherConfig.specific_height = canvasConfigReadonly().ELEMENT_WAIT_DEFAULT;
|
|
189
|
+
}
|
|
190
|
+
if (!branch.nodeOtherConfig.specific_width) {
|
|
191
|
+
branch.nodeOtherConfig.specific_width = canvasConfigReadonly().ELEMENT_WAIT_DEFAULT;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
branch.attributeSvgD = `${M} ${L} ${QL1} ${QL2}`;
|
|
195
|
+
const isCheckAllElementConnectToExit = this.checkChildrenConnectToExit(branch.elements);
|
|
196
|
+
branch.positionMaxTop = coordQL2.y;
|
|
197
|
+
checkMaxTop(config, branch.nodeOtherConfig?.specific_y, branch.positionMaxTop);
|
|
198
|
+
return { coordQL1, coordQL2, isCheckAllElementConnectToExit };
|
|
199
|
+
}
|
|
200
|
+
static checkChildrenConnectToExit(elements) {
|
|
201
|
+
let toExit = false;
|
|
202
|
+
if (elements.length &&
|
|
203
|
+
(elements[elements.length - 1].subCodeOfElement || elements[elements.length - 1].code) === canvasConfigReadonly().TYPE_ELEMENT_EXIT) {
|
|
204
|
+
return true;
|
|
205
|
+
}
|
|
206
|
+
elements.forEach((element) => {
|
|
207
|
+
if (!element.branches || !element.branches.length)
|
|
208
|
+
return;
|
|
209
|
+
let branchConnectToExit = 0;
|
|
210
|
+
element.branches.forEach((branch) => {
|
|
211
|
+
if (this.checkChildrenConnectToExit(branch.elements))
|
|
212
|
+
branchConnectToExit++;
|
|
213
|
+
});
|
|
214
|
+
if (branchConnectToExit === element.branches.length)
|
|
215
|
+
toExit = true;
|
|
216
|
+
});
|
|
217
|
+
return toExit;
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Quy ước:
|
|
221
|
+
* above + opposite=true → a - b (đi lên, y giảm)
|
|
222
|
+
* above + opposite=false → a + b
|
|
223
|
+
* under + opposite=true → a + b (đi xuống, y tăng)
|
|
224
|
+
* under + opposite=false → a - b
|
|
225
|
+
*/
|
|
226
|
+
static mathOp(direction, a, b, opposite) {
|
|
227
|
+
const av = a ?? 0;
|
|
228
|
+
const bv = b ?? 0;
|
|
229
|
+
switch (direction) {
|
|
230
|
+
case 'above':
|
|
231
|
+
return opposite ? av - bv : av + bv;
|
|
232
|
+
case 'under':
|
|
233
|
+
return opposite ? av + bv : av - bv;
|
|
234
|
+
default:
|
|
235
|
+
return av - bv;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
/** Alias để tương thích với code cũ gọi mathOperatorsCalculation */
|
|
239
|
+
static mathOperatorsCalculation(direction, a, b, opposite) {
|
|
240
|
+
return this.mathOp(direction, a, b, opposite);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsY3VsYXRvci1icmFuY2gudXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMtdWkvc2VydmljZXMvZGlhZ3JhbS1kcmF3L3NyYy91dGlscy9ob3Jpem9udGFsL2NhbGN1bGF0b3ItYnJhbmNoLnV0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFbEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRXpELE9BQU8sRUFBcUMsbUJBQW1CLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNwRyxPQUFPLEVBQUUsK0NBQStDLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUVoRzs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUNILE1BQU0sT0FBTywwQ0FBMEM7SUFDN0MsTUFBTSxDQUFDLGlDQUFpQyxDQUFDLE1BQTZCO1FBQzVFLElBQUksTUFBTSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQzNCLE1BQU0sVUFBVSxHQUFHLEdBQUcsQ0FBQyxDQUFDLGtFQUFrRTtZQUMxRixPQUFPLFVBQVUsR0FBRyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLEdBQUcsb0JBQW9CLEVBQUUsQ0FBQyxlQUFlLENBQUM7UUFDM0csQ0FBQztRQUNELE9BQU8sb0JBQW9CLEVBQUUsQ0FBQyw4Q0FBOEMsQ0FBQztJQUMvRSxDQUFDO0lBRUQsZ0ZBQWdGO0lBRWhGLCtDQUErQztJQUMvQyxNQUFNLENBQUMsZ0JBQWdCLENBQ3JCLEdBQVcsRUFBMkIsd0JBQXdCO0lBQzlELDBCQUFrQyxFQUFJLHFDQUFxQztJQUMzRSxJQUFZLEVBQTBCLHlCQUF5QjtJQUMvRCxNQUE2QixFQUM3QixjQUFzQixFQUN0QixNQUE2QjtRQUU3QixNQUFNLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQztRQUM1QixNQUFNLFNBQVMsR0FBRyxJQUFJ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LFNBQVMsRUFBRSxDQUFDO1lBQ2xCLEtBQUssT0FBTztnQkFDVixPQUFPLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztZQUN0QyxLQUFLLE9BQU87Z0JBQ1YsT0FBTyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7WUFDdEM7Z0JBQ0UsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDO1FBQ25CLENBQUM7SUFDSCxDQUFDO0lBRUQsb0VBQW9FO0lBQ3BFLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxTQUFxQyxFQUFFLENBQXFCLEVBQUUsQ0FBcUIsRUFBRSxRQUFrQjtRQUNySSxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDaEQsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY2FudmFzQ29uZmlnUmVhZG9ubHkgfSBmcm9tICcuLi8uLi9kaWFncmFtLWRyYXcuc2VydmljZSc7XG5pbXBvcnQgeyBJQ29vcmRpbmF0ZXNEaWFncmFtU3ZnLCBJRGF0YURpYWdyYW1Db25maWdTdmcgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL2Nvb3JkaW5hdGVzLmludGVyZmFjZSc7XG5pbXBvcnQgeyBjaGVja01heFRvcCB9IGZyb20gJy4uL2NhbGN1bGF0b3ItZWxlbWVudC51dGlsJztcbmltcG9ydCB7IElEaWFncmFtRWxlbWVudCwgSURpYWdyYW1FbGVtZW50QnJhbmNoIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9kaWFncmFtLmludGVyZmFjZSc7XG5pbXBvcnQgeyBnZXREaXN0YW5jZUZyb21CcmFuY2hUb0ZpcnN0QmxvY2ssIGdldEhlaWdodFdhaXRDb25maWcgfSBmcm9tICcuLi9jYWxjdWxhdG9yLWVsZW1lbnQudXRpbCc7XG5pbXBvcnQgeyBNb0xpYkRpYWdyYW1Ib3Jpem9udGFsQ2FsY3VsYXRvckNvb3JkaW5hdGVzVXRpbCB9IGZyb20gJy4vY2FsY3VsYXRvci1jb29yZGluYXRlcy51dGlsJztcblxuLyoqXG4gKiBIb3Jpem9udGFsIGJyYW5jaCBjYWxjdWxhdG9yLlxuICogRmxvdyBkaXJlY3Rpb246IExFRlQg4oaSIFJJR0hUICh0csOhaSBzYW5nIHBo4bqjaSkuXG4gKiBCcmFuY2hlcyBzcHJlYWQ6ICBhYm92ZSA9IFVQICh5IGdp4bqjbSksICB1bmRlciA9IERPV04gKHkgdMSDbmcpLlxuICpcbiAqIE1hcHBpbmcgdOG7qyB0cuG7pWMgZOG7jWMgc2FuZyBuZ2FuZzpcbiAqICAgdmVydGljYWwgXCJsZWZ0XCIgIGJyYW5jaCAoeCBnaeG6o20pIOKGlCBob3Jpem9udGFsIFwiYWJvdmVcIiBicmFuY2ggKHkgZ2nhuqNtKVxuICogICB2ZXJ0aWNhbCBcInJpZ2h0XCIgYnJhbmNoICh4IHTEg25nKSDihpQgaG9yaXpvbnRhbCBcInVuZGVyXCIgYnJhbmNoICAoeSB0xINuZylcbiAqXG4gKiBLw70gaGnhu4d1IHRyb25nIElDb29yZGluYXRlc0RpYWdyYW1Tdmc6XG4gKiAgIChteCxteSkgPSDEkWnhu4NtIGLhuq90IMSR4bqndSBRIGN1cnZlXG4gKiAgICh4MSx5MSkgPSBjb250cm9sIHBvaW50XG4gKiAgICh4LHkpICAgPSBlbmQgcG9pbnQgY+G7p2EgUSBjdXJ2ZVxuICogICAobHgsbHkpID0gxJFp4buDbSBjdeG7kWkgY+G7p2EgTCBzYXUgUVxuICovXG5leHBvcnQgY2xhc3MgTW9MaWJEaWFncmFtSG9yaXpvbnRhbENhbGN1bGF0b3JCcmFuY2hVdGlsIHtcbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0SG9yaXpvbnRhbERpc3RhbmNlVG9GaXJzdEJsb2NrKGJyYW5jaDogSURpYWdyYW1FbGVtZW50QnJhbmNoKSB7XG4gICAgaWYgKGJyYW5jaC5ub2RlT3RoZXJDb25maWcpIHtcbiAgICAgIGNvbnN0IGRpc3RUb1dhaXQgPSAxMTA7IC8vIGluY3JlYXNlIHN0YXRpY2FsbHkgc2luY2UgYnJhbmNoIGxhYmVsIGlzIGFsd2F5cyBhc3NpZ25lZCBsYXRlclxuICAgICAgcmV0dXJuIGRpc3RUb1dhaXQgKyBnZXRIZWlnaHRXYWl0Q29uZmlnKGJyYW5jaC5ub2RlT3RoZXJDb25maWcpICsgY2FudmFzQ29uZmlnUmVhZG9ubHkoKS5XQUlUX1RPX0VMRU1FTlQ7XG4gICAgfVxuICAgIHJldHVybiBjYW52YXNDb25maWdSZWFkb25seSgpLkVMRU1FTlRfTUFSR0lOX0RFRkFVTFRfQlJBTkNIX1RPX0VMRU1FTlRfRklSU1Q7XG4gIH1cblxuICAvLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgcHVibGljIOKUgOKUgFxuXG4gIC8qKiBOaMOhbmggZ2nhu69hIChjZW50ZXIpOiBrw6lvIHRo4bqzbmcgc2FuZyBwaOG6o2kgKi9cbiAgc3RhdGljIGRyYXdTdHJhaWdodExpbmUoXG4gICAgdG9wOiBudW1iZXIsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBZIHTDom0gY+G7p2EgZWxlbWVudCBjaGFcbiAgICBsaW5lRm9ybUVsZW1lbnRUb0JyYW5jaGluZzogbnVtYmVyLCAgIC8vIHdpZHRoIGVsZW1lbnQgKyBtYXJnaW4gxJHhur9uIMSRaeG7g20gcuG6vVxuICAgIGxlZnQ6IG51bWJlciwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gWCB0csOhaSBj4bunYSBlbGVtZW50IGNoYVxuICAgIGJyYW5jaDogSURpYWdyYW1FbGVtZW50QnJhbmNoLFxuICAgIG1heFdpZHRoQnJhbmNoOiBudW1iZXIsXG4gICAgY29uZmlnOiBJRGF0YURpYWdyYW1Db25maWdTdmdcbiAgKSB7XG4gICAgYnJhbmNoLm9uVGhlU2lkZSA9ICdjZW50ZXInO1xuICAgIGNvbnN0IHN0YXJ0RHJhdyA9IGxlZnQgKyBsaW5lRm9ybUVsZW1lbnRUb0JyYW5jaGluZztcbiAgICBsZXQgTHggPSBzdGFydERyYXc7XG5cbiAgICBMeCArPSBjYW52YXNDb25maWdSZWFkb25seSgpLkVMRU1FTlRfSEVJR0hUX0NVUlZFO1xuICAgIEx4ICs9IHRoaXMuZ2V0SG9yaXpvbnRhbERpc3RhbmNlVG9GaXJzdEJsb2NrKGJyYW5jaCk7XG4gICAgaWYgKCFicmFuY2guZWxlbWVudHMgfHwgIWJyYW5jaC5lbGVtZW50cy5sZW5ndGgpIHtcbiAgICAgIEx4ICs9IG1heFdpZHRoQnJhbmNoICsgMjA7XG4gICAgfVxuXG4gICAgY29uc3QgY29vcmQxID0geyBteDogbGVmdCwgbXk6IHRvcCwgbHg6IEx4LCBseTogdG9wIH07XG5cbiAgICBicmFuY2guYXR0cmlidXRlU3ZnRCA9IGBNICR7Y29vcmQxLm14fSAke2Nvb3JkMS5teX0gTCAke2Nvb3JkMS5seH0gJHtjb29yZDEubHl9YDtcblxuICAgIGlmIChicmFuY2gubm9kZU90aGVyQ29uZmlnKSB7XG4gICAgICBjb25zdCBkaXN0VG9XYWl0ID0gMTEwO1xuICAgICAgY29uc3QgZW5kWFRvV2FpdCA9IHN0YXJ0RHJhdyArIGNhbnZhc0NvbmZpZ1JlYWRvbmx5KCkuRUxFTUVOVF9IRUlHSFRfQ1VSVkUgKyBkaXN0VG9XYWl0O1xuXG4gICAgICBicmFuY2guYXR0cmlidXRlU3ZnRCA9IGBNICR7Y29vcmQxLm14fSAke2Nvb3JkMS5teX0gTCAke2VuZFhUb1dhaXR9ICR7Y29vcmQxLm15fWA7XG4gICAgICBjb25zdCB3YWl0V2lkdGggID0gZ2V0SGVpZ2h0V2FpdENvbmZpZyhicmFuY2gubm9kZU90aGVyQ29uZmlnKTtcbiAgICAgIGNvbnN0IGxlZnRMaW5lMiAgPSBlbmRYVG9XYWl0ICsgd2FpdFdpZHRoO1xuXG4gICAgICBkZWxldGUgYnJhbmNoLm5vZGVPdGhlckNvbmZpZy5hdHRyaWJ1dGVTdmdEO1xuICAgICAgaWYgKGJyYW5jaC5lbGVtZW50cyAmJiBicmFuY2guZWxlbWVudHMubGVuZ3RoKSB7XG4gICAgICAgIGJyYW5jaC5ub2RlT3RoZXJDb25maWcuYXR0cmlidXRlU3ZnRCA9IGBNICR7bGVmdExpbmUyfSAke2Nvb3JkMS5teX0gTCAke2Nvb3JkMS5seH0gJHtjb29yZDEubXl9YDtcbiAgICAgIH1cbiAgICAgIGJyYW5jaC5ub2RlT3RoZXJDb25maWcuc3BlY2lmaWNfeCA9IGVuZFhUb1dhaXQ7XG4gICAgICBicmFuY2gubm9kZU90aGVyQ29uZmlnLnNwZWNpZmljX3kgPSBjb29yZDEubXk7XG4gICAgICAvLyDEkOG6o20gYuG6o28gY8OzIGvDrWNoIHRoxrDhu5tjIMSR4buDIHNldFRyYW5zbGF0ZVBvc2l0aW9ucyB0w61uaCBvZmZzZXQgxJHDum5nXG4gICAgICBpZiAoIWJyYW5jaC5ub2RlT3RoZXJDb25maWcuc3BlY2lmaWNfaGVpZ2h0KSB7XG4gICAgICAgIGJyYW5jaC5ub2RlT3RoZXJDb25maWcuc3BlY2lmaWNfaGVpZ2h0ID0gY2FudmFzQ29uZmlnUmVhZG9ubHkoKS5FTEVNRU5UX1dBSVRfREVGQVVMVDtcbiAgICAgIH1cbiAgICAgIGlmICghYnJhbmNoLm5vZGVPdGhlckNvbmZpZy5zcGVjaWZpY193aWR0aCkge1xuICAgICAgICBicmFuY2gubm9kZU90aGVyQ29uZmlnLnNwZWNpZmljX3dpZHRoID0gY2FudmFzQ29uZmlnUmVhZG9ubHkoKS5FTEVNRU5UX1dBSVRfREVGQVVMVDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBicmFuY2guc3BlY2lmaWNfc3RhcnRfYnJhbmNoX3ggPSBsZWZ0ICsgbGluZUZvcm1FbGVtZW50VG9CcmFuY2hpbmcgKyBjYW52YXNDb25maWdSZWFkb25seSgpLkVMRU1FTlRfSEVJR0hUX0NVUlZFO1xuICAgIGJyYW5jaC5zcGVjaWZpY19zdGFydF9icmFuY2hfeSA9IHRvcDtcblxuICAgIGlmICghYnJhbmNoLmVsZW1lbnRzIHx8ICFicmFuY2guZWxlbWVudHMubGVuZ3RoKSByZXR1cm47XG5cbiAgICBjb25zdCB3aWR0aFRvRWxlbWVudCA9IGNhbnZhc0NvbmZpZ1JlYWRvbmx5KCkuRUxFTUVOVF9IRUlHSFRfQ1VSVkUgKyB0aGlzLmdldEhvcml6b250YWxEaXN0YW5jZVRvRmlyc3RCbG9jayhicmFuY2gpO1xuXG4gICAgYnJhbmNoLmVsZW1lbnRzLmZvckVhY2goKGVsKSA9PiB7XG4gICAgICBlbC5zcGVjaWZpY194ID0gbGVmdCArIGxpbmVGb3JtRWxlbWVudFRvQnJhbmNoaW5nICsgd2lkdGhUb0VsZW1lbnQ7XG4gICAgICBlbC5zcGVjaWZpY195ID0gdG9wIC0gKGVsLnNwZWNpZmljX2hlaWdodCA/PyAwKSAvIDI7XG4gICAgfSk7XG4gICAgTW9MaWJEaWFncmFtSG9yaXpvbnRhbENhbGN1bGF0b3JDb29yZGluYXRlc1V0aWwuc2V0WFlFbGVtZW50cyhicmFuY2guZWxlbWVudHMsIGNvbmZpZyk7XG4gIH1cblxuICAvKiogTmjDoW5oIHBow61hIHRyw6puIChhYm92ZSk6IHLhur0gbMOqbiwgcuG7k2kgYuG6uyBwaOG6o2kgxJHhur9uIGVsZW1lbnQgKi9cbiAgc3RhdGljIGFib3ZlTGluZShcbiAgICB0b3A6IG51bWJlcixcbiAgICBsaW5lRm9ybUVsZW1lbnRUb0JyYW5jaGluZzogbnVtYmVyLFxuICAgIGxlZnQ6IG51bWJlcixcbiAgICBsaW5lQmV0d2VlbkJyYW5jaDogbnVtYmVyLFxuICAgIGJyYW5jaDogSURpYWdyYW1FbGVtZW50QnJhbmNoLFxuICAgIG1heFdpZHRoQnJhbmNoOiBudW1iZXIsXG4gICAgZWxlbWVudDogSURpYWdyYW1FbGVtZW50LFxuICAgIGNvbmZpZzogSURhdGFEaWFncmFtQ29uZmlnU3ZnXG4gICkge1xuICAgIGJyYW5jaC5vblRoZVNpZGUgPSAnYWJvdmUnO1xuICAgIGNvbnN0IHsgY29vcmRRTDIsIGlzQ2hlY2tBbGxFbGVtZW50Q29ubmVjdFRvRXhpdCB9ID0gdGhpcy5kcmF3QWJvdmVVbmRlckxpbmUoXG4gICAgICB0b3AsIGxpbmVGb3JtRWxlbWVudFRvQnJhbmNoaW5nLCBsZWZ0LCBsaW5lQmV0d2VlbkJyYW5jaCwgYnJhbmNoLCBtYXhXaWR0aEJyYW5jaCwgJ2Fib3ZlJywgY29uZmlnXG4gICAgKTtcblxuICAgIGJyYW5jaC5zcGVjaWZpY19zdGFydF9icmFuY2hfeCA9IGNvb3JkUUwyLng7XG4gICAgYnJhbmNoLnNwZWNpZmljX3N0YXJ0X2JyYW5jaF95ID0gY29vcmRRTDIueTtcblxuICAgIGlmICghYnJhbmNoLmVsZW1lbnRzIHx8ICFicmFuY2guZWxlbWVudHMubGVuZ3RoKSByZXR1cm47XG4gICAgdGhpcy5kcmF3RWxlbWVudEluQnJhbmNoTGluZShicmFuY2gsIGNvb3JkUUwyLCBjb25maWcpO1xuICAgIGlmIChpc0NoZWNrQWxsRWxlbWVudENvbm5lY3RUb0V4aXQpIHJldHVybjtcbiAgfVxuXG4gIC8qKiBOaMOhbmggcGjDrWEgZMaw4bubaSAodW5kZXIpOiBy4bq9IHh14buRbmcsIHLhu5NpIGLhursgcGjhuqNpIMSR4bq/biBlbGVtZW50ICovXG4gIHN0YXRpYyB1bmRlckxpbmUoXG4gICAgdG9wOiBudW1iZXIsXG4gICAgbGluZUZvcm1FbGVtZW50VG9CcmFuY2hpbmc6IG51bWJlcixcbiAgICBsZWZ0OiBudW1iZXIsXG4gICAgbGluZUJldHdlZW5CcmFuY2g6IG51bWJlcixcbiAgICBicmFuY2g6IElEaWFncmFtRWxlbWVudEJyYW5jaCxcbiAgICBtYXhXaWR0aEJyYW5jaDogbnVtYmVyLFxuICAgIGVsZW1lbnQ6IElEaWFncmFtRWxlbWVudCxcbiAgICBjb25maWc6IElEYXRhRGlhZ3JhbUNvbmZpZ1N2Z1xuICApIHtcbiAgICBicmFuY2gub25UaGVTaWRlID0gJ3VuZGVyJztcbiAgICBjb25zdCB7IGNvb3JkUUwxLCBjb29yZFFMMiwgaXNDaGVja0FsbEVsZW1lbnRDb25uZWN0VG9FeGl0IH0gPSB0aGlzLmRyYXdBYm92ZVVuZGVyTGluZShcbiAgICAgIHRvcCwgbGluZUZvcm1FbGVtZW50VG9CcmFuY2hpbmcsIGxlZnQsIGxpbmVCZXR3ZWVuQnJhbmNoLCBicmFuY2gsIG1heFdpZHRoQnJhbmNoLCAndW5kZXInLCBjb25maWdcbiAgICApO1xuXG4gICAgYnJhbmNoLnNwZWNpZmljX3N0YXJ0X2JyYW5jaF94ID0gY29vcmRRTDIueDtcbiAgICBicmFuY2guc3BlY2lmaWNfc3RhcnRfYnJhbmNoX3kgPSBjb29yZFFMMi55O1xuXG4gICAgLy8gTeG7nyBy4buZbmcgd2lkdGhTdmcgbuG6v3UgbmjDoW5oIHh14buRbmcgdsaw4bujdFxuICAgIGNvbnN0IG1heFkgPSAoY29vcmRRTDEueSA/PyAwKSArIDIwMDtcbiAgICBjb25zdCBjb25maWdTdmcgPSBjb25maWcud2lkdGhIZWlnaHRTdmdDYW52YXM7XG5cbiAgICBjb25maWdTdmcuaGVpZ2h0U3ZnID0gbWF4WSA+IGNvbmZpZ1N2Zy5oZWlnaHRTdmcgPyBtYXhZIDogY29uZmlnU3ZnLmhlaWdodFN2ZztcblxuICAgIGlmICghYnJhbmNoLmVsZW1lbnRzIHx8ICFicmFuY2guZWxlbWVudHMubGVuZ3RoKSByZXR1cm47XG4gICAgdGhpcy5kcmF3RWxlbWVudEluQnJhbmNoTGluZShicmFuY2gsIGNvb3JkUUwyLCBjb25maWcpO1xuICAgIGlmIChpc0NoZWNrQWxsRWxlbWVudENvbm5lY3RUb0V4aXQpIHJldHVybjtcbiAgfVxuXG4gIC8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCBwcml2YXRlIOKUgOKUgFxuXG4gIC8qKiDEkOG6t3QgZWxlbWVudCDEkeG6p3UgdGnDqm4gdHJvbmcgbmjDoW5oIGThu7FhIHRoZW8gdOG7jWEgxJHhu5kgY3Xhu5FpIGPhu6dhIFFMMiAqL1xuICBzdGF0aWMgZHJhd0VsZW1lbnRJbkJyYW5jaExpbmUoYnJhbmNoOiBJRGlhZ3JhbUVsZW1lbnRCcmFuY2gsIGNvb3JkUUwyOiBJQ29vcmRpbmF0ZXNEaWFncmFtU3ZnLCBjb25maWc6IElEYXRhRGlhZ3JhbUNvbmZpZ1N2Zykge1xuICAgIGNvbnN0IGVsZW1lbnRGaXJzdCA9IGJyYW5jaC5lbGVtZW50c1swXTtcblxuICAgIC8vIGx4ID0gWCBi4bqvdCDEkeG6p3UgY+G7p2EgZWxlbWVudDsgbHkgPSBZIHTDom0gbmjDoW5oIOKGkiBzcGVjaWZpY195ID0gdMOibSAtIGhhbGYgaGVpZ2h0XG4gICAgZWxlbWVudEZpcnN0LnNwZWNpZmljX3ggPSBjb29yZFFMMi5seDtcbiAgICBlbGVtZW50Rmlyc3Quc3BlY2lmaWNfeSA9IChjb29yZFFMMi5seSA/PyAwKSAtIChlbGVtZW50Rmlyc3Quc3BlY2lmaWNfaGVpZ2h0ID8/IDApIC8gMjtcbiAgICBNb0xpYkRpYWdyYW1Ib3Jpem9udGFsQ2FsY3VsYXRvckNvb3JkaW5hdGVzVXRpbC5zZXRYWUVsZW1lbnRzKGJyYW5jaC5lbGVtZW50cywgY29uZmlnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBW4bq9IMSRxrDhu51uZyBy4bq9IG5ow6FuaCBraeG7g3UgaG9yaXpvbnRhbDpcbiAgICpcbiAgICogICBNIGxlZnQgdG9wICAgICAgICAgIOKGkiBi4bqvdCDEkeG6p3UgdOG6oWkgdMOibSBZIGPhu6dhIGVsZW1lbnQgY2hhXG4gICAqICAgTCBMeCAgIHRvcCAgICAgICAgICDihpIga8OpbyBOR0FORyBzYW5nIHBo4bqjaSDEkeG6v24gxJFp4buDbSBy4bq9ICAoTHggPSBsZWZ0ICsgbGluZUZvcm1FbGVtZW50VG9CcmFuY2hpbmcgLSBDVVJWRSlcbiAgICpcbiAgICogICBRTDE6IGLhursgdOG7qyBoxrDhu5tuZyDihpIgc2FuZyBoxrDhu5tuZyDihpEgKGFib3ZlKSBob+G6t2Mg4oaTICh1bmRlcilcbiAgICogICAgIE0gKEx4LCB0b3ApXG4gICAqICAgICBRIChMeCtDLCB0b3ApICDihpIgIChMeCtDLCB0b3DCsUMpICAgICAgIGNvbnRyb2wgxJFpIHRo4bqzbmcgcGjhuqNpLCDEkWnhu4NtIGvhur90IGLhuq90IMSR4bqndSDEkWkgZOG7jWNcbiAgICogICAgIEwgIEx4K0MsIHRvcMKxQ8Kxc3RyYWlnaHQgICAgICAgICAgICAgICBrw6lvIHRo4bqzbmcgZOG7jWMgKGzDqm4veHXhu5FuZylcbiAgICpcbiAgICogICBRTDI6IGLhursgbmfGsOG7o2MgbOG6oWkg4oaSIGjGsOG7m25nIG5nYW5nIMSR4buDIHThu5tpIGVsZW1lbnRcbiAgICogICAgIFEgKEx4K0MsIHRvcMKxQ8Kxc3RyYWlnaHTCsUMpICDihpIgIChMeCsyQywgdG9wwrFDwrFzdHJhaWdodMKxQylcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgxJFpIHRp4bq/cCBk4buNYywgxJFp4buDbSBr4bq/dCDEkWkgbmdhbmcgKHBo4bqjaSlcbiAgICogICAgIEwgIEx4KzJDK2Rpc3RUb0ZpcnN0LCBzYW1lX1kgICBrw6lvIG5nYW5nIMSR4bq/biB24buLIHRyw60gZWxlbWVudCDEkeG6p3UgdGnDqm5cbiAgICpcbiAgICogICBTYXUgUUwyOlxuICAgKiAgICAgY29vcmRRTDIubHggID0gWCBi4bqvdCDEkeG6p3UgY+G7p2EgZWxlbWVudCDEkeG6p3UgdGnDqm5cbiAgICogICAgIGNvb3JkUUwyLmx5ICA9IFkgdMOibSBj4bunYSBuaMOhbmhcbiAgICovXG4gIHN0YXRpYyBkcmF3QWJvdmVVbmRlckxpbmUoXG4gICAgdG9wOiBudW1iZXIsXG4gICAgbGluZUZvcm1FbGVtZW50VG9CcmFuY2hpbmc6IG51bWJlcixcbiAgICBsZWZ0OiBudW1iZXIsXG4gICAgbGluZUJldHdlZW5CcmFuY2g6IG51bWJlcixcbiAgICBicmFuY2g6IElEaWFncmFtRWxlbWVudEJyYW5jaCxcbiAgICBtYXhXaWR0aEJyYW5jaDogbnVtYmVyLFxuICAgIGRpcmVjdGlvbjogJ2Fib3ZlJyB8ICd1bmRlcicsXG4gICAgY29uZmlnOiBJRGF0YURpYWdyYW1Db25maWdTdmdcbiAgKSB7XG4gICAgY29uc3QgQ1VSVkUgID0gY2FudmFzQ29uZmlnUmVhZG9ubHkoKS5FTEVNRU5UX0hFSUdIVF9DVVJWRTtcbiAgICBjb25zdCBNICAgICAgPSBgTSAke2xlZnR9ICR7dG9wfWA7XG4gICAgY29uc3QgTHggICAgID0gbGVmdCArIGxpbmVGb3JtRWxlbWVudFRvQnJhbmNoaW5nIC0gQ1VSVkU7XG4gICAgY29uc3QgTCAgICAgID0gYEwgJHtMeH0gJHt0b3B9YDtcbiAgICBjb25zdCBzdHJhaWdodCA9IGxpbmVCZXR3ZWVuQnJhbmNoIC0gQ1VSVkUgKiAyOyAvLyDEkW/huqFuIHRo4bqzbmcgZOG7jWMgKGLhu48gMiBjb25nIMSR4bqndS1jdeG7kWkpXG5cbiAgICAvLyDilIDilIAgUUwxOiBjdXJ2ZSB04burIGjGsOG7m25nIG5nYW5nIOKGkiBoxrDhu5tuZyBk4buNYyAobMOqbi94deG7kW5nKSwgcuG7k2kgdGjhurNuZyBk4buNYyDilIDilIDilIDilIBcbiAgICBjb25zdCBjb29yZFFMMTogSUNvb3JkaW5hdGVzRGlhZ3JhbVN2ZyA9IHtcbiAgICAgIG14OiBMeCxcbiAgICAgIG15OiB0b3AsXG4gICAgICB4MTogTHggKyBDVVJWRSwgICAgICAgICAgLy8gY29udHJvbDogxJFpIHRo4bqzbmcgcGjhuqNpIHRow6ptIENVUlZFXG4gICAgICB5MTogdG9wLCAgICAgICAgICAgICAgICAgIC8vIGNvbnRyb2w6IGPDuW5nIFlcbiAgICAgIHg6ICBMeCArIENVUlZFLCAgICAgICAgICAvLyBlbmQgWDogZ2nhu68gbmd1ecOqbiAoPSBMeCtDVVJWRSlcbiAgICAgIHk6ICB0aGlzLm1hdGhPcChkaXJlY3Rpb24sIHRvcCwgQ1VSVkUsIHRydWUpLFxuICAgICAgLy8gICAnYWJvdmUnOiB0b3AgLSBDVVJWRSAgKGLhuq90IMSR4bqndSDEkWkgbMOqbilcbiAgICAgIC8vICAgJ3VuZGVyJzogdG9wICsgQ1VSVkUgIChi4bqvdCDEkeG6p3UgxJFpIHh14buRbmcpXG4gICAgfTtcbiAgICAvLyDEkG/huqFuIEwgc2F1IFFMMTogZ2nhu68gbmd1ecOqbiBYLCB0aeG6v3AgdOG7pWMgxJFpIGThu41jXG4gICAgY29vcmRRTDEubHggPSBjb29yZFFMMS54OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gWCBraMO0bmcgxJHhu5VpXG4gICAgY29vcmRRTDEubHkgPSB0aGlzLm1hdGhPcChkaXJlY3Rpb24sIGNvb3JkUUwxLnksIHN0cmFpZ2h0LCB0cnVlKTsgLy8gdGnhur9wIHThu6VjIGzDqm4veHXhu5FuZ1xuXG4gICAgY29uc3QgUUwxID0gYE0gJHtjb29yZFFMMS5teH0sJHtjb29yZFFMMS5teX0gUSAke2Nvb3JkUUwxLngxfSwke2Nvb3JkUUwxLnkxfSAke2Nvb3JkUUwxLnh9LCR7Y29vcmRRTDEueX0gTCAke2Nvb3JkUUwxLmx4fSAke2Nvb3JkUUwxLmx5fWA7XG5cbiAgICAvLyDilIDilIAgUUwyOiBjdXJ2ZSB04burIGjGsOG7m25nIGThu41jIOKGkiBoxrDhu5tuZyBuZ2FuZyAocGjhuqNpKSwgcuG7k2kgdGjhurNuZyBuZ2FuZyDEkeG6v24gZWxlbWVudCDilIDilIBcbiAgICBjb25zdCBjb29yZFFMMjogSUNvb3JkaW5hdGVzRGlhZ3JhbVN2ZyA9IHtcbiAgICAgIC8vIGNvbnRyb2w6IHRp4bq/cCB04bulYyDEkWkgZOG7jWMgdGjDqm0gQ1VSVkUgdOG7qyDEkWnhu4NtIGN14buRaSBRTDFcbiAgICAgIHgxOiBjb29yZFFMMS5seCxcbiAgICAgIHkxOiB0aGlzLm1hdGhPcChkaXJlY3Rpb24sIGNvb3JkUUwxLmx5LCBDVVJWRSwgdHJ1ZSksXG4gICAgICAvLyBlbmQ6IHLhur0gbmdhbmcgc2FuZyBwaOG6o2kgdGjDqm0gQ1VSVkUsIGdp4buvIG5ndXnDqm4gWSB04bqhaSB5MVxuICAgICAgeTogIHRoaXMubWF0aE9wKGRpcmVjdGlvbiwgY29vcmRRTDEubHksIENVUlZFLCB0cnVlKSxcbiAgICAgIHg6ICAoY29vcmRRTDEubHggPz8gMCkgKyBDVVJWRSxcbiAgICB9O1xuXG4gICAgLy8gxJBv4bqhbiBMIHNhdSBRTDI6IMSRaSBuZ2FuZyAocGjhuqNpKSDEkeG6v24gduG7iyB0csOtIGVsZW1lbnQgxJHhuqd1IHRpw6puIHRyb25nIG5ow6FuaFxuICAgIGNvbnN0IGRpc3RUb0ZpcnN0ID0gdGhpcy5nZXRIb3Jpem9udGFsRGlzdGFuY2VUb0ZpcnN0QmxvY2soYnJhbmNoKTtcblxuICAgIGlmICghYnJhbmNoLmVsZW1lbnRzIHx8ICFicmFuY2guZWxlbWVudHMubGVuZ3RoKSB7XG4gICAgICBjb29yZFFMMi5seCA9IChjb29yZFFMMi54ID8/IDApICsgZGlzdFRvRmlyc3QgKyBtYXhXaWR0aEJyYW5jaDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29vcmRRTDIubHggPSAoY29vcmRRTDIueCA/PyAwKSArIGRpc3RUb0ZpcnN0O1xuICAgIH1cbiAgICBjb29yZFFMMi5seSA9IGNvb3JkUUwyLnk7IC8vIFkga2jDtG5nIMSR4buVaSDihpIgdMOibSBZIGPhu6dhIG5ow6FuaFxuXG4gICAgLy8gWOG7rSBsw70gbm9kZU90aGVyQ29uZmlnICh3YWl0IGJsb2NrKSB0csOqbiBuaMOhbmhcbiAgICBsZXQgUUwyID0gYFEgJHtjb29yZFFMMi54MX0sJHtjb29yZFFMMi55MX0gJHtjb29yZFFMMi54fSwke2Nvb3JkUUwyLnl9IEwgJHtjb29yZFFMMi5seH0gJHtjb29yZFFMMi5seX1gO1xuXG4gICAgaWYgKGJyYW5jaC5ub2RlT3RoZXJDb25maWcpIHtcbiAgICAgIGNvbnN0IGRpc3RUb1dhaXQgPSAxMTA7XG4gICAgICBjb25zdCBlbmRYVG9XYWl0ID0gKGNvb3JkUUwyLnggPz8gMCkgKyBkaXN0VG9XYWl0O1xuICAgICAgY29uc3Qgd2FpdFdpZHRoICA9IGdldEhlaWdodFdhaXRDb25maWcoYnJhbmNoLm5vZGVPdGhlckNvbmZpZyk7XG4gICAgICBjb25zdCBsZWZ0TGluZTIgID0gZW5kWFRvV2FpdCArIHdhaXRXaWR0aDtcblxuICAgICAgZGVsZXRlIGJyYW5jaC5ub2RlT3RoZXJDb25maWcuYXR0cmlidXRlU3ZnRDtcbiAgICAgIFFMMiA9IGBRICR7Y29vcmRRTDIueDF9LCR7Y29vcmRRTDIueTF9ICR7Y29vcmRRTDIueH0sJHtjb29yZFFMMi55fSBNICR7Y29vcmRRTDIueH0sJHtjb29yZFFMMi55fSBMICR7ZW5kWFRvV2FpdH0sJHtjb29yZFFMMi55fWA7XG4gICAgICBpZiAoYnJhbmNoLmVsZW1lbnRzICYmIGJyYW5jaC5lbGVtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgYnJhbmNoLm5vZGVPdGhlckNvbmZpZy5hdHRyaWJ1dGVTdmdEID0gYE0gJHtsZWZ0TGluZTJ9ICR7Y29vcmRRTDIueX0gTCAke2Nvb3JkUUwyLmx4fSAke2Nvb3JkUUwyLmx5fWA7XG4gICAgICB9XG4gICAgICBicmFuY2gubm9kZU90aGVyQ29uZmlnLnNwZWNpZmljX3ggPSBlbmRYVG9XYWl0O1xuICAgICAgLy8gc3BlY2lmaWNfeSA9IHTDom0gWSBj4bunYSBuaMOhbmgg4oCUIHNldFRyYW5zbGF0ZVBvc2l0aW9ucyBz4bq9IHRy4burIGhlaWdodC8yIGtoaSBzZXQgdHJhbnNsYXRlWVxuICAgICAgYnJhbmNoLm5vZGVPdGhlckNvbmZpZy5zcGVjaWZpY195ID0gY29vcmRRTDIueSA/PyAwO1xuICAgICAgLy8gxJDhuqNtIGLhuqNvIGPDsyBrw61jaCB0aMaw4bubYyDEkeG7gyBzZXRUcmFuc2xhdGVQb3NpdGlvbnMgdMOtbmggb2Zmc2V0IMSRw7puZ1xuICAgICAgaWYgKCFicmFuY2gubm9kZU90aGVyQ29uZmlnLnNwZWNpZmljX2hlaWdodCkge1xuICAgICAgICBicmFuY2gubm9kZU90aGVyQ29uZmlnLnNwZWNpZmljX2hlaWdodCA9IGNhbnZhc0NvbmZpZ1JlYWRvbmx5KCkuRUxFTUVOVF9XQUlUX0RFRkFVTFQ7XG4gICAgICB9XG4gICAgICBpZiAoIWJyYW5jaC5ub2RlT3RoZXJDb25maWcuc3BlY2lmaWNfd2lkdGgpIHtcbiAgICAgICAgYnJhbmNoLm5vZGVPdGhlckNvbmZpZy5zcGVjaWZpY193aWR0aCA9IGNhbnZhc0NvbmZpZ1JlYWRvbmx5KCkuRUxFTUVOVF9XQUlUX0RFRkFVTFQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgYnJhbmNoLmF0dHJpYnV0ZVN2Z0QgPSBgJHtNfSAke0x9ICR7UUwxfSAke1FMMn1gO1xuICAgIGNvbnN0IGlzQ2hlY2tBbGxFbGVtZW50Q29ubmVjdFRvRXhpdCA9IHRoaXMuY2hlY2tDaGlsZHJlbkNvbm5lY3RUb0V4aXQoYnJhbmNoLmVsZW1lbnRzKTtcblxuICAgIGJyYW5jaC5wb3NpdGlvbk1heFRvcCA9IGNvb3JkUUwyLnk7XG4gICAgY2hlY2tNYXhUb3AoY29uZmlnLCBicmFuY2gubm9kZU90aGVyQ29uZmlnPy5zcGVjaWZpY195LCBicmFuY2gucG9zaXRpb25NYXhUb3ApO1xuXG4gICAgcmV0dXJuIHsgY29vcmRRTDEsIGNvb3JkUUwyLCBpc0NoZWNrQWxsRWxlbWVudENvbm5lY3RUb0V4aXQgfTtcbiAgfVxuXG4gIHN0YXRpYyBjaGVja0NoaWxkcmVuQ29ubmVjdFRvRXhpdChlbGVtZW50czogSURpYWdyYW1FbGVtZW50W10pOiBib29sZWFuIHtcbiAgICBsZXQgdG9FeGl0ID0gZmFsc2U7XG5cbiAgICBpZiAoXG4gICAgICBlbGVtZW50cy5sZW5ndGggJiZcbiAgICAgIChlbGVtZW50c1tlbGVtZW50cy5sZW5ndGggLSAxXS5zdWJDb2RlT2ZFbGVtZW50IHx8IGVsZW1lbnRzW2VsZW1lbnRzLmxlbmd0aCAtIDFdLmNvZGUpID09PSBjYW52YXNDb25maWdSZWFkb25seSgpLlRZUEVfRUxFTUVOVF9FWElUXG4gICAgKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgZWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgaWYgKCFlbGVtZW50LmJyYW5jaGVzIHx8ICFlbGVtZW50LmJyYW5jaGVzLmxlbmd0aCkgcmV0dXJuO1xuICAgICAgbGV0IGJyYW5jaENvbm5lY3RUb0V4aXQgPSAwO1xuXG4gICAgICBlbGVtZW50LmJyYW5jaGVzLmZvckVhY2goKGJyYW5jaCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5jaGVja0NoaWxkcmVuQ29ubmVjdFRvRXhpdChicmFuY2guZWxlbWVudHMpKSBicmFuY2hDb25uZWN0VG9FeGl0Kys7XG4gICAgICB9KTtcbiAgICAgIGlmIChicmFuY2hDb25uZWN0VG9FeGl0ID09PSBlbGVtZW50LmJyYW5jaGVzLmxlbmd0aCkgdG9FeGl0ID0gdHJ1ZTtcbiAgICB9KTtcblxuICAgIHJldHVybiB0b0V4aXQ7XG4gIH1cblxuICAvKipcbiAgICogUXV5IMaw4bubYzpcbiAgICogICBhYm92ZSArIG9wcG9zaXRlPXRydWUg4oaSIGEgLSBiICAoxJFpIGzDqm4sIHkgZ2nhuqNtKVxuICAgKiAgIGFib3ZlICsgb3Bwb3NpdGU9ZmFsc2Ug4oaSIGEgKyBiXG4gICAqICAgdW5kZXIgKyBvcHBvc2l0ZT10cnVlIOKGkiBhICsgYiAgKMSRaSB4deG7kW5nLCB5IHTEg25nKVxuICAgKiAgIHVuZGVyICsgb3Bwb3NpdGU9ZmFsc2Ug4oaSIGEgLSBiXG4gICAqL1xuICBzdGF0aWMgbWF0aE9wKGRpcmVjdGlvbjogJ2Fib3ZlJyB8ICd1bmRlcicgfCBzdHJpbmcsIGE6IG51bWJlciB8IHVuZGVmaW5lZCwgYjogbnVtYmVyIHwgdW5kZWZpbmVkLCBvcHBvc2l0ZT86IGJvb2xlYW4pOiBudW1iZXIge1xuICAgIGNvbnN0IGF2ID0gYSA/PyAwO1xuICAgIGNvbnN0IGJ2ID0gYiA/PyAwO1xuXG4gICAgc3dpdGNoIChkaXJlY3Rpb24pIHtcbiAgICAgIGNhc2UgJ2Fib3ZlJzpcbiAgICAgICAgcmV0dXJuIG9wcG9zaXRlID8gYXYgLSBidiA6IGF2ICsgYnY7XG4gICAgICBjYXNlICd1bmRlcic6XG4gICAgICAgIHJldHVybiBvcHBvc2l0ZSA/IGF2ICsgYnYgOiBhdiAtIGJ2O1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGF2IC0gYnY7XG4gICAgfVxuICB9XG5cbiAgLyoqIEFsaWFzIMSR4buDIHTGsMahbmcgdGjDrWNoIHbhu5tpIGNvZGUgY8WpIGfhu41pIG1hdGhPcGVyYXRvcnNDYWxjdWxhdGlvbiAqL1xuICBzdGF0aWMgbWF0aE9wZXJhdG9yc0NhbGN1bGF0aW9uKGRpcmVjdGlvbjogJ2Fib3ZlJyB8ICd1bmRlcicgfCBzdHJpbmcsIGE6IG51bWJlciB8IHVuZGVmaW5lZCwgYjogbnVtYmVyIHwgdW5kZWZpbmVkLCBvcHBvc2l0ZT86IGJvb2xlYW4pOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLm1hdGhPcChkaXJlY3Rpb24sIGEsIGIsIG9wcG9zaXRlKTtcbiAgfVxufVxuIl19
|