@bnsights/bbsf-utilities 1.0.69-beta.2 → 1.0.69-beta.3
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/esm2022/lib/shared/models/index.mjs +1 -2
- package/esm2022/lib/shared/services/index.mjs +1 -2
- package/esm2022/public-api.mjs +3 -5
- package/fesm2022/bnsights-bbsf-utilities.mjs +1 -64
- package/fesm2022/bnsights-bbsf-utilities.mjs.map +1 -1
- package/lib/shared/models/index.d.ts +0 -1
- package/lib/shared/services/index.d.ts +0 -1
- package/package.json +1 -16
- package/public-api.d.ts +0 -2
- package/esm2022/lib/shared/config/word/constants.mjs +0 -105
- package/esm2022/lib/shared/config/word/docx-document.mjs +0 -348
- package/esm2022/lib/shared/config/word/helpers/index.mjs +0 -4
- package/esm2022/lib/shared/config/word/helpers/render-document-file.mjs +0 -154
- package/esm2022/lib/shared/config/word/helpers/xml-builder.mjs +0 -1836
- package/esm2022/lib/shared/config/word/html-to-docx.mjs +0 -187
- package/esm2022/lib/shared/config/word/index.mjs +0 -50
- package/esm2022/lib/shared/config/word/namespaces.mjs +0 -37
- package/esm2022/lib/shared/config/word/schemas/content-types.mjs +0 -26
- package/esm2022/lib/shared/config/word/schemas/core.mjs +0 -27
- package/esm2022/lib/shared/config/word/schemas/document-rels.mjs +0 -16
- package/esm2022/lib/shared/config/word/schemas/document.template.mjs +0 -107
- package/esm2022/lib/shared/config/word/schemas/font-table.mjs +0 -40
- package/esm2022/lib/shared/config/word/schemas/generic-rels.mjs +0 -11
- package/esm2022/lib/shared/config/word/schemas/index.mjs +0 -13
- package/esm2022/lib/shared/config/word/schemas/numbering.mjs +0 -17
- package/esm2022/lib/shared/config/word/schemas/rels.mjs +0 -11
- package/esm2022/lib/shared/config/word/schemas/settings.mjs +0 -13
- package/esm2022/lib/shared/config/word/schemas/styles.mjs +0 -147
- package/esm2022/lib/shared/config/word/schemas/theme.mjs +0 -198
- package/esm2022/lib/shared/config/word/schemas/web-settings.mjs +0 -9
- package/esm2022/lib/shared/config/word/utils/color-conversion.mjs +0 -60
- package/esm2022/lib/shared/config/word/utils/list.mjs +0 -51
- package/esm2022/lib/shared/config/word/utils/unit-conversion.mjs +0 -30
- package/esm2022/lib/shared/config/word/utils/url.mjs +0 -7
- package/esm2022/lib/shared/config/word/utils/vnode.mjs +0 -3
- package/esm2022/lib/shared/config/word/word-work/templates/documentTemplate.mjs +0 -54
- package/esm2022/lib/shared/config/word/word-work/templates/index.mjs +0 -4
- package/esm2022/lib/shared/config/word/word-work/templates/mhtDocumentTemplate.mjs +0 -22
- package/esm2022/lib/shared/config/word/word-work/templates/mhtPartTemplate.mjs +0 -10
- package/esm2022/lib/shared/config/word/word-work/utils.mjs +0 -26
- package/esm2022/lib/shared/models/word-document-model.mjs +0 -8
- package/esm2022/lib/shared/services/word-document.service.mjs +0 -57
- package/esm2022/word/bnsights-bbsf-utilities-word.mjs +0 -5
- package/esm2022/word/public-api.mjs +0 -9
- package/fesm2022/bnsights-bbsf-utilities-index-C3Twnewr.mjs +0 -3536
- package/fesm2022/bnsights-bbsf-utilities-index-C3Twnewr.mjs.map +0 -1
- package/fesm2022/bnsights-bbsf-utilities-word.mjs +0 -13
- package/fesm2022/bnsights-bbsf-utilities-word.mjs.map +0 -1
- package/lib/shared/config/word/constants.d.ts +0 -124
- package/lib/shared/config/word/docx-document.d.ts +0 -73
- package/lib/shared/config/word/helpers/index.d.ts +0 -1
- package/lib/shared/config/word/helpers/render-document-file.d.ts +0 -2
- package/lib/shared/config/word/helpers/xml-builder.d.ts +0 -16
- package/lib/shared/config/word/html-to-docx.d.ts +0 -1
- package/lib/shared/config/word/index.d.ts +0 -1
- package/lib/shared/config/word/namespaces.d.ts +0 -36
- package/lib/shared/config/word/schemas/content-types.d.ts +0 -1
- package/lib/shared/config/word/schemas/core.d.ts +0 -1
- package/lib/shared/config/word/schemas/document-rels.d.ts +0 -1
- package/lib/shared/config/word/schemas/document.template.d.ts +0 -4
- package/lib/shared/config/word/schemas/font-table.d.ts +0 -1
- package/lib/shared/config/word/schemas/generic-rels.d.ts +0 -1
- package/lib/shared/config/word/schemas/index.d.ts +0 -12
- package/lib/shared/config/word/schemas/numbering.d.ts +0 -1
- package/lib/shared/config/word/schemas/rels.d.ts +0 -1
- package/lib/shared/config/word/schemas/settings.d.ts +0 -1
- package/lib/shared/config/word/schemas/styles.d.ts +0 -1
- package/lib/shared/config/word/schemas/theme.d.ts +0 -1
- package/lib/shared/config/word/schemas/web-settings.d.ts +0 -1
- package/lib/shared/config/word/utils/color-conversion.d.ts +0 -7
- package/lib/shared/config/word/utils/list.d.ts +0 -6
- package/lib/shared/config/word/utils/unit-conversion.d.ts +0 -29
- package/lib/shared/config/word/utils/url.d.ts +0 -1
- package/lib/shared/config/word/utils/vnode.d.ts +0 -1
- package/lib/shared/config/word/word-work/templates/documentTemplate.d.ts +0 -12
- package/lib/shared/config/word/word-work/templates/index.d.ts +0 -3
- package/lib/shared/config/word/word-work/templates/mhtDocumentTemplate.d.ts +0 -1
- package/lib/shared/config/word/word-work/templates/mhtPartTemplate.d.ts +0 -1
- package/lib/shared/config/word/word-work/utils.d.ts +0 -1
- package/lib/shared/models/word-document-model.d.ts +0 -16
- package/lib/shared/services/word-document.service.d.ts +0 -25
- package/word/index.d.ts +0 -5
- package/word/public-api.d.ts +0 -2
|
@@ -1,154 +0,0 @@
|
|
|
1
|
-
/* eslint-disable no-await-in-loop */
|
|
2
|
-
/* eslint-disable no-case-declarations */
|
|
3
|
-
import { fragment } from 'xmlbuilder2';
|
|
4
|
-
import VNode from 'virtual-dom/vnode/vnode';
|
|
5
|
-
import VText from 'virtual-dom/vnode/vtext';
|
|
6
|
-
import isVNode from 'virtual-dom/vnode/is-vnode';
|
|
7
|
-
import isVText from 'virtual-dom/vnode/is-vtext';
|
|
8
|
-
// eslint-disable-next-line import/no-named-default
|
|
9
|
-
import { default as HTMLToVDOM } from 'html-to-vdom';
|
|
10
|
-
import escape from 'escape-html';
|
|
11
|
-
// FIXME: remove the cyclic dependency
|
|
12
|
-
// eslint-disable-next-line import/no-cycle
|
|
13
|
-
import * as xmlBuilder from './xml-builder';
|
|
14
|
-
import namespaces from '../namespaces';
|
|
15
|
-
import { vNodeHasChildren } from '../utils/vnode';
|
|
16
|
-
const convertHTML = HTMLToVDOM({
|
|
17
|
-
VNode,
|
|
18
|
-
VText,
|
|
19
|
-
});
|
|
20
|
-
async function findXMLEquivalent(docxDocumentInstance, vNode, xmlFragment) {
|
|
21
|
-
if (vNode.tagName === 'div' &&
|
|
22
|
-
(vNode.properties.attributes.class === 'page-break' ||
|
|
23
|
-
(vNode.properties.style && vNode.properties.style['page-break-after']))) {
|
|
24
|
-
const paragraphFragment = fragment({ namespaceAlias: { w: namespaces.w } })
|
|
25
|
-
.ele('@w', 'p')
|
|
26
|
-
.ele('@w', 'r')
|
|
27
|
-
.ele('@w', 'br')
|
|
28
|
-
.att('@w', 'type', 'page')
|
|
29
|
-
.up()
|
|
30
|
-
.up()
|
|
31
|
-
.up();
|
|
32
|
-
xmlFragment.import(paragraphFragment);
|
|
33
|
-
return;
|
|
34
|
-
}
|
|
35
|
-
switch (vNode.tagName) {
|
|
36
|
-
case 'h1':
|
|
37
|
-
case 'h2':
|
|
38
|
-
case 'h3':
|
|
39
|
-
case 'h4':
|
|
40
|
-
case 'h5':
|
|
41
|
-
case 'h6':
|
|
42
|
-
const headingFragment = await xmlBuilder.buildParagraph(vNode, {
|
|
43
|
-
paragraphStyle: `Heading${vNode.tagName[1]}`,
|
|
44
|
-
}, docxDocumentInstance);
|
|
45
|
-
xmlFragment.import(headingFragment);
|
|
46
|
-
return;
|
|
47
|
-
case 'span':
|
|
48
|
-
case 'strong':
|
|
49
|
-
case 'b':
|
|
50
|
-
case 'em':
|
|
51
|
-
case 'i':
|
|
52
|
-
case 'u':
|
|
53
|
-
case 'ins':
|
|
54
|
-
case 'strike':
|
|
55
|
-
case 'del':
|
|
56
|
-
case 's':
|
|
57
|
-
case 'sub':
|
|
58
|
-
case 'sup':
|
|
59
|
-
case 'mark':
|
|
60
|
-
case 'p':
|
|
61
|
-
case 'a':
|
|
62
|
-
case 'blockquote':
|
|
63
|
-
case 'code':
|
|
64
|
-
case 'pre':
|
|
65
|
-
const paragraphFragment = await xmlBuilder.buildParagraph(vNode, {}, docxDocumentInstance);
|
|
66
|
-
xmlFragment.import(paragraphFragment);
|
|
67
|
-
return;
|
|
68
|
-
case 'figure':
|
|
69
|
-
if (vNodeHasChildren(vNode)) {
|
|
70
|
-
// eslint-disable-next-line no-plusplus
|
|
71
|
-
for (let index = 0; index < vNode.children.length; index++) {
|
|
72
|
-
const childVNode = vNode.children[index];
|
|
73
|
-
if (childVNode.tagName === 'table') {
|
|
74
|
-
const tableFragment = await xmlBuilder.buildTable(childVNode, {
|
|
75
|
-
maximumWidth: docxDocumentInstance.availableDocumentSpace,
|
|
76
|
-
rowCantSplit: docxDocumentInstance.tableRowCantSplit,
|
|
77
|
-
}, docxDocumentInstance);
|
|
78
|
-
xmlFragment.import(tableFragment);
|
|
79
|
-
// Adding empty paragraph for space after table
|
|
80
|
-
const emptyParagraphFragment = await xmlBuilder.buildParagraph(null, {});
|
|
81
|
-
xmlFragment.import(emptyParagraphFragment);
|
|
82
|
-
}
|
|
83
|
-
else if (childVNode.tagName === 'img') {
|
|
84
|
-
const imageFragment = await xmlBuilder.buildImage(docxDocumentInstance, childVNode);
|
|
85
|
-
if (imageFragment) {
|
|
86
|
-
xmlFragment.import(imageFragment);
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
return;
|
|
92
|
-
case 'table':
|
|
93
|
-
const tableFragment = await xmlBuilder.buildTable(vNode, {
|
|
94
|
-
maximumWidth: docxDocumentInstance.availableDocumentSpace,
|
|
95
|
-
rowCantSplit: docxDocumentInstance.tableRowCantSplit,
|
|
96
|
-
}, docxDocumentInstance);
|
|
97
|
-
xmlFragment.import(tableFragment);
|
|
98
|
-
// Adding empty paragraph for space after table
|
|
99
|
-
const emptyParagraphFragment = await xmlBuilder.buildParagraph(null, {});
|
|
100
|
-
xmlFragment.import(emptyParagraphFragment);
|
|
101
|
-
return;
|
|
102
|
-
case 'ol':
|
|
103
|
-
case 'ul':
|
|
104
|
-
await xmlBuilder.buildList(vNode, docxDocumentInstance, xmlFragment);
|
|
105
|
-
return;
|
|
106
|
-
case 'img':
|
|
107
|
-
const imageFragment = await xmlBuilder.buildImage(docxDocumentInstance, vNode);
|
|
108
|
-
if (imageFragment) {
|
|
109
|
-
xmlFragment.import(imageFragment);
|
|
110
|
-
}
|
|
111
|
-
return;
|
|
112
|
-
case 'br':
|
|
113
|
-
const linebreakFragment = await xmlBuilder.buildParagraph(null, {});
|
|
114
|
-
xmlFragment.import(linebreakFragment);
|
|
115
|
-
return;
|
|
116
|
-
}
|
|
117
|
-
if (vNodeHasChildren(vNode)) {
|
|
118
|
-
// eslint-disable-next-line no-plusplus
|
|
119
|
-
for (let index = 0; index < vNode.children.length; index++) {
|
|
120
|
-
const childVNode = vNode.children[index];
|
|
121
|
-
// eslint-disable-next-line no-use-before-define
|
|
122
|
-
await convertVTreeToXML(docxDocumentInstance, childVNode, xmlFragment);
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
// eslint-disable-next-line consistent-return
|
|
127
|
-
export async function convertVTreeToXML(docxDocumentInstance, vTree, xmlFragment) {
|
|
128
|
-
if (!vTree) {
|
|
129
|
-
// eslint-disable-next-line no-useless-return
|
|
130
|
-
return '';
|
|
131
|
-
}
|
|
132
|
-
if (Array.isArray(vTree) && vTree.length) {
|
|
133
|
-
// eslint-disable-next-line no-plusplus
|
|
134
|
-
for (let index = 0; index < vTree.length; index++) {
|
|
135
|
-
const vNode = vTree[index];
|
|
136
|
-
await convertVTreeToXML(docxDocumentInstance, vNode, xmlFragment);
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
else if (isVNode(vTree)) {
|
|
140
|
-
await findXMLEquivalent(docxDocumentInstance, vTree, xmlFragment);
|
|
141
|
-
}
|
|
142
|
-
else if (isVText(vTree)) {
|
|
143
|
-
xmlBuilder.buildTextElement(xmlFragment, escape(String(vTree.text)));
|
|
144
|
-
}
|
|
145
|
-
return xmlFragment;
|
|
146
|
-
}
|
|
147
|
-
async function renderDocumentFile(docxDocumentInstance) {
|
|
148
|
-
const vTree = convertHTML(docxDocumentInstance.htmlString);
|
|
149
|
-
const xmlFragment = fragment({ namespaceAlias: { w: namespaces.w } });
|
|
150
|
-
const populatedXmlFragment = await convertVTreeToXML(docxDocumentInstance, vTree, xmlFragment);
|
|
151
|
-
return populatedXmlFragment;
|
|
152
|
-
}
|
|
153
|
-
export { renderDocumentFile };
|
|
154
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVuZGVyLWRvY3VtZW50LWZpbGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9iYnNmLXV0aWxpdGllcy9zcmMvbGliL3NoYXJlZC9jb25maWcvd29yZC9oZWxwZXJzL3JlbmRlci1kb2N1bWVudC1maWxlLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHFDQUFxQztBQUNyQyx5Q0FBeUM7QUFDekMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN2QyxPQUFPLEtBQUssTUFBTSx5QkFBeUIsQ0FBQztBQUM1QyxPQUFPLEtBQUssTUFBTSx5QkFBeUIsQ0FBQztBQUM1QyxPQUFPLE9BQU8sTUFBTSw0QkFBNEIsQ0FBQztBQUNqRCxPQUFPLE9BQU8sTUFBTSw0QkFBNEIsQ0FBQztBQUNqRCxtREFBbUQ7QUFDbkQsT0FBTyxFQUFFLE9BQU8sSUFBSSxVQUFVLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDckQsT0FBTyxNQUFNLE1BQU0sYUFBYSxDQUFDO0FBRWpDLHNDQUFzQztBQUN0QywyQ0FBMkM7QUFDM0MsT0FBTyxLQUFLLFVBQVUsTUFBTSxlQUFlLENBQUM7QUFDNUMsT0FBTyxVQUFVLE1BQU0sZUFBZSxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRWxELE1BQU0sV0FBVyxHQUFHLFVBQVUsQ0FBQztJQUM3QixLQUFLO0lBQ0wsS0FBSztDQUNOLENBQUMsQ0FBQztBQUVILEtBQUssVUFBVSxpQkFBaUIsQ0FBQyxvQkFBb0IsRUFBRSxLQUFLLEVBQUUsV0FBVztJQUN2RSxJQUNFLEtBQUssQ0FBQyxPQUFPLEtBQUssS0FBSztRQUN2QixDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLEtBQUssS0FBSyxZQUFZO1lBQ2pELENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFD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LEVBQUUsV0FBVyxDQUFDLENBQUM7S0FDbkU7U0FBTSxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtRQUN6QixVQUFVLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUN0RTtJQUNELE9BQU8sV0FBVyxDQUFDO0FBQ3JCLENBQUM7QUFFRCxLQUFLLFVBQVUsa0JBQWtCLENBQUMsb0JBQW9CO0lBQ3BELE1BQU0sS0FBSyxHQUFHLFdBQVcsQ0FBQyxvQkFBb0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUUzRCxNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsRUFBRSxjQUFjLEVBQUUsRUFBRSxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUV0RSxNQUFNLG9CQUFvQixHQUFHLE1BQU0saUJBQWlCLENBQUMsb0JBQW9CLEVBQUUsS0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBRS9GLE9BQU8sb0JBQW9CLENBQUM7QUFDOUIsQ0FBQztBQUVELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tYXdhaXQtaW4tbG9vcCAqL1xyXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1jYXNlLWRlY2xhcmF0aW9ucyAqL1xyXG5pbXBvcnQgeyBmcmFnbWVudCB9IGZyb20gJ3htbGJ1aWxkZXIyJztcclxuaW1wb3J0IFZOb2RlIGZyb20gJ3ZpcnR1YWwtZG9tL3Zub2RlL3Zub2RlJztcclxuaW1wb3J0IFZUZXh0IGZyb20gJ3ZpcnR1YWwtZG9tL3Zub2RlL3Z0ZXh0JztcclxuaW1wb3J0IGlzVk5vZGUgZnJvbSAndmlydHVhbC1kb20vdm5vZGUvaXMtdm5vZGUnO1xyXG5pbXBvcnQgaXNWVGV4dCBmcm9tICd2aXJ0dWFsLWRvbS92bm9kZS9pcy12dGV4dCc7XHJcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tbmFtZWQtZGVmYXVsdFxyXG5pbXBvcnQgeyBkZWZhdWx0IGFzIEhUTUxUb1ZET00gfSBmcm9tICdodG1sLXRvLXZkb20nO1xyXG5pbXBvcnQgZXNjYXBlIGZyb20gJ2VzY2FwZS1odG1sJztcclxuXHJcbi8vIEZJWE1FOiByZW1vdmUgdGhlIGN5Y2xpYyBkZXBlbmRlbmN5XHJcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tY3ljbGVcclxuaW1wb3J0ICogYXMgeG1sQnVpbGRlciBmcm9tICcuL3htbC1idWlsZGVyJztcclxuaW1wb3J0IG5hbWVzcGFjZXMgZnJvbSAnLi4vbmFtZXNwYWNlcyc7XHJcbmltcG9ydCB7IHZOb2RlSGFzQ2hpbGRyZW4gfSBmcm9tICcuLi91dGlscy92bm9kZSc7XHJcblxyXG5jb25zdCBjb252ZXJ0SFRNTCA9IEhUTUxUb1ZET00oe1xyXG4gIFZOb2RlLFxyXG4gIFZUZXh0LFxyXG59KTtcclxuXHJcbmFzeW5jIGZ1bmN0aW9uIGZpbmRYTUxFcXVpdmFsZW50KGRvY3hEb2N1bWVudEluc3RhbmNlLCB2Tm9kZSwgeG1sRnJhZ21lbnQpIHtcclxuICBpZiAoXHJcbiAgICB2Tm9kZS50YWdOYW1lID09PSAnZGl2JyAmJlxyXG4gICAgKHZOb2RlLnByb3BlcnRpZXMuYXR0cmlidXRlcy5jbGFzcyA9PT0gJ3BhZ2UtYnJlYWsnIHx8XHJcbiAgICAgICh2Tm9kZS5wcm9wZXJ0aWVzLnN0eWxlICYmIHZOb2RlLnByb3BlcnRpZXMuc3R5bGVbJ3BhZ2UtYnJlYWstYWZ0ZXInXSkpXHJcbiAgKSB7XHJcbiAgICBjb25zdCBwYXJhZ3JhcGhGcmFnbWVudCA9IGZyYWdtZW50KHsgbmFtZXNwYWNlQWxpYXM6IHsgdzogbmFtZXNwYWNlcy53IH0gfSlcclxuICAgICAgLmVsZSgnQHcnLCAncCcpXHJcbiAgICAgIC5lbGUoJ0B3JywgJ3InKVxyXG4gICAgICAuZWxlKCdAdycsICdicicpXHJcbiAgICAgIC5hdHQoJ0B3JywgJ3R5cGUnLCAncGFnZScpXHJcbiAgICAgIC51cCgpXHJcbiAgICAgIC51cCgpXHJcbiAgICAgIC51cCgpO1xyXG5cclxuICAgIHhtbEZyYWdtZW50LmltcG9ydChwYXJhZ3JhcGhGcmFnbWVudCk7XHJcbiAgICByZXR1cm47XHJcbiAgfVxyXG5cclxuICBzd2l0Y2ggKHZOb2RlLnRhZ05hbWUpIHtcclxuICAgIGNhc2UgJ2gxJzpcclxuICAgIGNhc2UgJ2gyJzpcclxuICAgIGNhc2UgJ2gzJzpcclxuICAgIGNhc2UgJ2g0JzpcclxuICAgIGNhc2UgJ2g1JzpcclxuICAgIGNhc2UgJ2g2JzpcclxuICAgICAgY29uc3QgaGVhZGluZ0ZyYWdtZW50ID0gYXdhaXQgeG1sQnVpbGRlci5idWlsZFBhcmFncmFwaChcclxuICAgICAgICB2Tm9kZSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBwYXJhZ3JhcGhTdHlsZTogYEhlYWRpbmcke3ZOb2RlLnRhZ05hbWVbMV19YCxcclxuICAgICAgICB9LFxyXG4gICAgICAgIGRvY3hEb2N1bWVudEluc3RhbmNlXHJcbiAgICAgICk7XHJcbiAgICAgIHhtbEZyYWdtZW50LmltcG9ydChoZWFkaW5nRnJhZ21lbnQpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICBjYXNlICdzcGFuJzpcclxuICAgIGNhc2UgJ3N0cm9uZyc6XHJcbiAgICBjYXNlICdiJzpcclxuICAgIGNhc2UgJ2VtJzpcclxuICAgIGNhc2UgJ2knOlxyXG4gICAgY2FzZSAndSc6XHJcbiAgICBjYXNlICdpbnMnOlxyXG4gICAgY2FzZSAnc3RyaWtlJzpcclxuICAgIGNhc2UgJ2RlbCc6XHJcbiAgICBjYXNlICdzJzpcclxuICAgIGNhc2UgJ3N1Yic6XHJcbiAgICBjYXNlICdzdXAnOlxyXG4gICAgY2FzZSAnbWFyayc6XHJcbiAgICBjYXNlICdwJzpcclxuICAgIGNhc2UgJ2EnOlxyXG4gICAgY2FzZSAnYmxvY2txdW90ZSc6XHJcbiAgICBjYXNlICdjb2RlJzpcclxuICAgIGNhc2UgJ3ByZSc6XHJcbiAgICAgIGNvbnN0IHBhcmFncmFwaEZyYWdtZW50ID0gYXdhaXQgeG1sQnVpbGRlci5idWlsZFBhcmFncmFwaCh2Tm9kZSwge30sIGRvY3hEb2N1bWVudEluc3RhbmNlKTtcclxuICAgICAgeG1sRnJhZ21lbnQuaW1wb3J0KHBhcmFncmFwaEZyYWdtZW50KTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgY2FzZSAnZmlndXJlJzpcclxuICAgICAgaWYgKHZOb2RlSGFzQ2hpbGRyZW4odk5vZGUpKSB7XHJcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBsdXNwbHVzXHJcbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHZOb2RlLmNoaWxkcmVuLmxlbmd0aDsgaW5kZXgrKykge1xyXG4gICAgICAgICAgY29uc3QgY2hpbGRWTm9kZSA9IHZOb2RlLmNoaWxkcmVuW2luZGV4XTtcclxuICAgICAgICAgIGlmIChjaGlsZFZOb2RlLnRhZ05hbWUgPT09ICd0YWJsZScpIHtcclxuICAgICAgICAgICAgY29uc3QgdGFibGVGcmFnbWVudCA9IGF3YWl0IHhtbEJ1aWxkZXIuYnVpbGRUYWJsZShcclxuICAgICAgICAgICAgICBjaGlsZFZOb2RlLFxyXG4gICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG1heGltdW1XaWR0aDogZG9jeERvY3VtZW50SW5zdGFuY2UuYXZhaWxhYmxlRG9jdW1lbnRTcGFjZSxcclxuICAgICAgICAgICAgICAgIHJvd0NhbnRTcGxpdDogZG9jeERvY3VtZW50SW5zdGFuY2UudGFibGVSb3dDYW50U3BsaXQsXHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICBkb2N4RG9jdW1lbnRJbnN0YW5jZVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB4bWxGcmFnbWVudC5pbXBvcnQodGFibGVGcmFnbWVudCk7XHJcbiAgICAgICAgICAgIC8vIEFkZGluZyBlbXB0eSBwYXJhZ3JhcGggZm9yIHNwYWNlIGFmdGVyIHRhYmxlXHJcbiAgICAgICAgICAgIGNvbnN0IGVtcHR5UGFyYWdyYXBoRnJhZ21lbnQgPSBhd2FpdCB4bWxCdWlsZGVyLmJ1aWxkUGFyYWdyYXBoKG51bGwsIHt9KTtcclxuICAgICAgICAgICAgeG1sRnJhZ21lbnQuaW1wb3J0KGVtcHR5UGFyYWdyYXBoRnJhZ21lbnQpO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChjaGlsZFZOb2RlLnRhZ05hbWUgPT09ICdpbWcnKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGltYWdlRnJhZ21lbnQgPSBhd2FpdCB4bWxCdWlsZGVyLmJ1aWxkSW1hZ2UoZG9jeERvY3VtZW50SW5zdGFuY2UsIGNoaWxkVk5vZGUpO1xyXG4gICAgICAgICAgICBpZiAoaW1hZ2VGcmFnbWVudCkge1xyXG4gICAgICAgICAgICAgIHhtbEZyYWdtZW50LmltcG9ydChpbWFnZUZyYWdtZW50KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICByZXR1cm47XHJcbiAgICBjYXNlICd0YWJsZSc6XHJcbiAgICAgIGNvbnN0IHRhYmxlRnJhZ21lbnQgPSBhd2FpdCB4bWxCdWlsZGVyLmJ1aWxkVGFibGUoXHJcbiAgICAgICAgdk5vZGUsXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgbWF4aW11bVdpZHRoOiBkb2N4RG9jdW1lbnRJbnN0YW5jZS5hdmFpbGFibGVEb2N1bWVudFNwYWNlLFxyXG4gICAgICAgICAgcm93Q2FudFNwbGl0OiBkb2N4RG9jdW1lbnRJbnN0YW5jZS50YWJsZVJvd0NhbnRTcGxpdCxcclxuICAgICAgICB9LFxyXG4gICAgICAgIGRvY3hEb2N1bWVudEluc3RhbmNlXHJcbiAgICAgICk7XHJcbiAgICAgIHhtbEZyYWdtZW50LmltcG9ydCh0YWJsZUZyYWdtZW50KTtcclxuICAgICAgLy8gQWRkaW5nIGVtcHR5IHBhcmFncmFwaCBmb3Igc3BhY2UgYWZ0ZXIgdGFibGVcclxuICAgICAgY29uc3QgZW1wdHlQYXJhZ3JhcGhGcmFnbWVudCA9IGF3YWl0IHhtbEJ1aWxkZXIuYnVpbGRQYXJhZ3JhcGgobnVsbCwge30pO1xyXG4gICAgICB4bWxGcmFnbWVudC5pbXBvcnQoZW1wdHlQYXJhZ3JhcGhGcmFnbWVudCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIGNhc2UgJ29sJzpcclxuICAgIGNhc2UgJ3VsJzpcclxuICAgICAgYXdhaXQgeG1sQnVpbGRlci5idWlsZExpc3Qodk5vZGUsIGRvY3hEb2N1bWVudEluc3RhbmNlLCB4bWxGcmFnbWVudCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIGNhc2UgJ2ltZyc6XHJcbiAgICAgIGNvbnN0IGltYWdlRnJhZ21lbnQgPSBhd2FpdCB4bWxCdWlsZGVyLmJ1aWxkSW1hZ2UoZG9jeERvY3VtZW50SW5zdGFuY2UsIHZOb2RlKTtcclxuICAgICAgaWYgKGltYWdlRnJhZ21lbnQpIHtcclxuICAgICAgICB4bWxGcmFnbWVudC5pbXBvcnQoaW1hZ2VGcmFnbWVudCk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuO1xyXG4gICAgY2FzZSAnYnInOlxyXG4gICAgICBjb25zdCBsaW5lYnJlYWtGcmFnbWVudCA9IGF3YWl0IHhtbEJ1aWxkZXIuYnVpbGRQYXJhZ3JhcGgobnVsbCwge30pO1xyXG4gICAgICB4bWxGcmFnbWVudC5pbXBvcnQobGluZWJyZWFrRnJhZ21lbnQpO1xyXG4gICAgICByZXR1cm47XHJcbiAgfVxyXG4gIGlmICh2Tm9kZUhhc0NoaWxkcmVuKHZOb2RlKSkge1xyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBsdXNwbHVzXHJcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdk5vZGUuY2hpbGRyZW4ubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgIGNvbnN0IGNoaWxkVk5vZGUgPSB2Tm9kZS5jaGlsZHJlbltpbmRleF07XHJcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZVxyXG4gICAgICBhd2FpdCBjb252ZXJ0VlRyZWVUb1hNTChkb2N4RG9jdW1lbnRJbnN0YW5jZSwgY2hpbGRWTm9kZSwgeG1sRnJhZ21lbnQpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbnNpc3RlbnQtcmV0dXJuXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjb252ZXJ0VlRyZWVUb1hNTChkb2N4RG9jdW1lbnRJbnN0YW5jZSwgdlRyZWUsIHhtbEZyYWdtZW50KSB7XHJcbiAgaWYgKCF2VHJlZSkge1xyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZWxlc3MtcmV0dXJuXHJcbiAgICByZXR1cm4gJyc7XHJcbiAgfVxyXG4gIGlmIChBcnJheS5pc0FycmF5KHZUcmVlKSAmJiB2VHJlZS5sZW5ndGgpIHtcclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wbHVzcGx1c1xyXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHZUcmVlLmxlbmd0aDsgaW5kZXgrKykge1xyXG4gICAgICBjb25zdCB2Tm9kZSA9IHZUcmVlW2luZGV4XTtcclxuICAgICAgYXdhaXQgY29udmVydFZUcmVlVG9YTUwoZG9jeERvY3VtZW50SW5zdGFuY2UsIHZOb2RlLCB4bWxGcmFnbWVudCk7XHJcbiAgICB9XHJcbiAgfSBlbHNlIGlmIChpc1ZOb2RlKHZUcmVlKSkge1xyXG4gICAgYXdhaXQgZmluZFhNTEVxdWl2YWxlbnQoZG9jeERvY3VtZW50SW5zdGFuY2UsIHZUcmVlLCB4bWxGcmFnbWVudCk7XHJcbiAgfSBlbHNlIGlmIChpc1ZUZXh0KHZUcmVlKSkge1xyXG4gICAgeG1sQnVpbGRlci5idWlsZFRleHRFbGVtZW50KHhtbEZyYWdtZW50LCBlc2NhcGUoU3RyaW5nKHZUcmVlLnRleHQpKSk7XHJcbiAgfVxyXG4gIHJldHVybiB4bWxGcmFnbWVudDtcclxufVxyXG5cclxuYXN5bmMgZnVuY3Rpb24gcmVuZGVyRG9jdW1lbnRGaWxlKGRvY3hEb2N1bWVudEluc3RhbmNlKSB7XHJcbiAgY29uc3QgdlRyZWUgPSBjb252ZXJ0SFRNTChkb2N4RG9jdW1lbnRJbnN0YW5jZS5odG1sU3RyaW5nKTtcclxuXHJcbiAgY29uc3QgeG1sRnJhZ21lbnQgPSBmcmFnbWVudCh7IG5hbWVzcGFjZUFsaWFzOiB7IHc6IG5hbWVzcGFjZXMudyB9IH0pO1xyXG5cclxuICBjb25zdCBwb3B1bGF0ZWRYbWxGcmFnbWVudCA9IGF3YWl0IGNvbnZlcnRWVHJlZVRvWE1MKGRvY3hEb2N1bWVudEluc3RhbmNlLCB2VHJlZSwgeG1sRnJhZ21lbnQpO1xyXG5cclxuICByZXR1cm4gcG9wdWxhdGVkWG1sRnJhZ21lbnQ7XHJcbn1cclxuXHJcbmV4cG9ydCB7IHJlbmRlckRvY3VtZW50RmlsZSB9O1xyXG4iXX0=
|