@bnsights/bbsf-utilities 1.0.69 → 1.2.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.
Files changed (122) hide show
  1. package/README.md +167 -2
  2. package/auth/index.d.ts +5 -0
  3. package/auth/public-api.d.ts +1 -0
  4. package/fesm2022/bnsights-bbsf-utilities-auth.mjs +10 -0
  5. package/fesm2022/bnsights-bbsf-utilities-auth.mjs.map +1 -0
  6. package/fesm2022/bnsights-bbsf-utilities-http.mjs +10 -0
  7. package/fesm2022/bnsights-bbsf-utilities-http.mjs.map +1 -0
  8. package/fesm2022/bnsights-bbsf-utilities-translate.mjs +10 -0
  9. package/fesm2022/bnsights-bbsf-utilities-translate.mjs.map +1 -0
  10. package/fesm2022/bnsights-bbsf-utilities-ui.mjs +10 -0
  11. package/fesm2022/bnsights-bbsf-utilities-ui.mjs.map +1 -0
  12. package/fesm2022/bnsights-bbsf-utilities.mjs +369 -3842
  13. package/fesm2022/bnsights-bbsf-utilities.mjs.map +1 -1
  14. package/http/index.d.ts +5 -0
  15. package/http/public-api.d.ts +4 -0
  16. package/lib/bbsf-utilities.module.d.ts +22 -2
  17. package/lib/shared/authentication/auth.service.d.ts +0 -1
  18. package/lib/shared/models/index.d.ts +0 -1
  19. package/lib/shared/services/index.d.ts +0 -1
  20. package/lib/shared/services/language.service.d.ts +12 -0
  21. package/lib/shared/services/request-handler.service.d.ts +2 -3
  22. package/lib/shared/services/styles-bundle.service.d.ts +7 -1
  23. package/package.json +32 -25
  24. package/public-api.d.ts +14 -12
  25. package/translate/index.d.ts +5 -0
  26. package/translate/public-api.d.ts +3 -0
  27. package/ui/index.d.ts +5 -0
  28. package/ui/public-api.d.ts +4 -0
  29. package/esm2022/bnsights-bbsf-utilities.mjs +0 -5
  30. package/esm2022/lib/bbsf-utilities.module.mjs +0 -63
  31. package/esm2022/lib/shared/authentication/auth.service.mjs +0 -260
  32. package/esm2022/lib/shared/authentication/index.mjs +0 -2
  33. package/esm2022/lib/shared/config/environment.mjs +0 -12
  34. package/esm2022/lib/shared/config/word/constants.mjs +0 -105
  35. package/esm2022/lib/shared/config/word/docx-document.mjs +0 -348
  36. package/esm2022/lib/shared/config/word/helpers/index.mjs +0 -4
  37. package/esm2022/lib/shared/config/word/helpers/render-document-file.mjs +0 -154
  38. package/esm2022/lib/shared/config/word/helpers/xml-builder.mjs +0 -1836
  39. package/esm2022/lib/shared/config/word/html-to-docx.mjs +0 -187
  40. package/esm2022/lib/shared/config/word/index.mjs +0 -50
  41. package/esm2022/lib/shared/config/word/namespaces.mjs +0 -37
  42. package/esm2022/lib/shared/config/word/schemas/content-types.mjs +0 -26
  43. package/esm2022/lib/shared/config/word/schemas/core.mjs +0 -27
  44. package/esm2022/lib/shared/config/word/schemas/document-rels.mjs +0 -16
  45. package/esm2022/lib/shared/config/word/schemas/document.template.mjs +0 -107
  46. package/esm2022/lib/shared/config/word/schemas/font-table.mjs +0 -40
  47. package/esm2022/lib/shared/config/word/schemas/generic-rels.mjs +0 -11
  48. package/esm2022/lib/shared/config/word/schemas/index.mjs +0 -13
  49. package/esm2022/lib/shared/config/word/schemas/numbering.mjs +0 -17
  50. package/esm2022/lib/shared/config/word/schemas/rels.mjs +0 -11
  51. package/esm2022/lib/shared/config/word/schemas/settings.mjs +0 -13
  52. package/esm2022/lib/shared/config/word/schemas/styles.mjs +0 -147
  53. package/esm2022/lib/shared/config/word/schemas/theme.mjs +0 -198
  54. package/esm2022/lib/shared/config/word/schemas/web-settings.mjs +0 -9
  55. package/esm2022/lib/shared/config/word/utils/color-conversion.mjs +0 -60
  56. package/esm2022/lib/shared/config/word/utils/list.mjs +0 -51
  57. package/esm2022/lib/shared/config/word/utils/unit-conversion.mjs +0 -30
  58. package/esm2022/lib/shared/config/word/utils/url.mjs +0 -7
  59. package/esm2022/lib/shared/config/word/utils/vnode.mjs +0 -3
  60. package/esm2022/lib/shared/config/word/word-work/templates/documentTemplate.mjs +0 -54
  61. package/esm2022/lib/shared/config/word/word-work/templates/index.mjs +0 -4
  62. package/esm2022/lib/shared/config/word/word-work/templates/mhtDocumentTemplate.mjs +0 -22
  63. package/esm2022/lib/shared/config/word/word-work/templates/mhtPartTemplate.mjs +0 -10
  64. package/esm2022/lib/shared/config/word/word-work/utils.mjs +0 -26
  65. package/esm2022/lib/shared/enums/authentication-modes-enums.mjs +0 -8
  66. package/esm2022/lib/shared/index.mjs +0 -4
  67. package/esm2022/lib/shared/models/UserModel.mjs +0 -3
  68. package/esm2022/lib/shared/models/area-model.mjs +0 -3
  69. package/esm2022/lib/shared/models/error-model.mjs +0 -3
  70. package/esm2022/lib/shared/models/index.mjs +0 -6
  71. package/esm2022/lib/shared/models/request-options-model.mjs +0 -11
  72. package/esm2022/lib/shared/models/speech-language.mjs +0 -3
  73. package/esm2022/lib/shared/models/word-document-model.mjs +0 -8
  74. package/esm2022/lib/shared/services/appearance-configuration.service.mjs +0 -35
  75. package/esm2022/lib/shared/services/configuration.service.mjs +0 -48
  76. package/esm2022/lib/shared/services/control-validation.service.mjs +0 -173
  77. package/esm2022/lib/shared/services/environment.service.mjs +0 -83
  78. package/esm2022/lib/shared/services/index.mjs +0 -15
  79. package/esm2022/lib/shared/services/language.service.mjs +0 -21
  80. package/esm2022/lib/shared/services/master-layout.service.mjs +0 -77
  81. package/esm2022/lib/shared/services/preload.service.mjs +0 -54
  82. package/esm2022/lib/shared/services/request-handler.service.mjs +0 -260
  83. package/esm2022/lib/shared/services/speech-recognition.service.mjs +0 -76
  84. package/esm2022/lib/shared/services/styles-bundle.service.mjs +0 -55
  85. package/esm2022/lib/shared/services/translate.service.mjs +0 -14
  86. package/esm2022/lib/shared/services/translation-resolver.service.mjs +0 -7
  87. package/esm2022/lib/shared/services/utility.service.mjs +0 -87
  88. package/esm2022/lib/shared/services/word-document.service.mjs +0 -38
  89. package/esm2022/public-api.mjs +0 -34
  90. package/lib/shared/config/word/constants.d.ts +0 -124
  91. package/lib/shared/config/word/docx-document.d.ts +0 -73
  92. package/lib/shared/config/word/helpers/index.d.ts +0 -1
  93. package/lib/shared/config/word/helpers/render-document-file.d.ts +0 -2
  94. package/lib/shared/config/word/helpers/xml-builder.d.ts +0 -16
  95. package/lib/shared/config/word/html-to-docx.d.ts +0 -1
  96. package/lib/shared/config/word/index.d.ts +0 -1
  97. package/lib/shared/config/word/namespaces.d.ts +0 -36
  98. package/lib/shared/config/word/schemas/content-types.d.ts +0 -1
  99. package/lib/shared/config/word/schemas/core.d.ts +0 -1
  100. package/lib/shared/config/word/schemas/document-rels.d.ts +0 -1
  101. package/lib/shared/config/word/schemas/document.template.d.ts +0 -4
  102. package/lib/shared/config/word/schemas/font-table.d.ts +0 -1
  103. package/lib/shared/config/word/schemas/generic-rels.d.ts +0 -1
  104. package/lib/shared/config/word/schemas/index.d.ts +0 -12
  105. package/lib/shared/config/word/schemas/numbering.d.ts +0 -1
  106. package/lib/shared/config/word/schemas/rels.d.ts +0 -1
  107. package/lib/shared/config/word/schemas/settings.d.ts +0 -1
  108. package/lib/shared/config/word/schemas/styles.d.ts +0 -1
  109. package/lib/shared/config/word/schemas/theme.d.ts +0 -1
  110. package/lib/shared/config/word/schemas/web-settings.d.ts +0 -1
  111. package/lib/shared/config/word/utils/color-conversion.d.ts +0 -7
  112. package/lib/shared/config/word/utils/list.d.ts +0 -6
  113. package/lib/shared/config/word/utils/unit-conversion.d.ts +0 -29
  114. package/lib/shared/config/word/utils/url.d.ts +0 -1
  115. package/lib/shared/config/word/utils/vnode.d.ts +0 -1
  116. package/lib/shared/config/word/word-work/templates/documentTemplate.d.ts +0 -12
  117. package/lib/shared/config/word/word-work/templates/index.d.ts +0 -3
  118. package/lib/shared/config/word/word-work/templates/mhtDocumentTemplate.d.ts +0 -1
  119. package/lib/shared/config/word/word-work/templates/mhtPartTemplate.d.ts +0 -1
  120. package/lib/shared/config/word/word-work/utils.d.ts +0 -1
  121. package/lib/shared/models/word-document-model.d.ts +0 -16
  122. package/lib/shared/services/word-document.service.d.ts +0 -8
@@ -1,1836 +0,0 @@
1
- /* eslint-disable no-await-in-loop */
2
- /* eslint-disable radix */
3
- /* eslint-disable no-param-reassign */
4
- /* eslint-disable no-case-declarations */
5
- /* eslint-disable no-plusplus */
6
- /* eslint-disable no-else-return */
7
- import { fragment } from 'xmlbuilder2';
8
- import isVNode from 'virtual-dom/vnode/is-vnode';
9
- import isVText from 'virtual-dom/vnode/is-vtext';
10
- import colorNames from 'color-name';
11
- import { cloneDeep } from 'lodash';
12
- import imageToBase64 from 'image-to-base64';
13
- import mimeTypes from 'mime-types';
14
- import sizeOf from 'image-size';
15
- import namespaces from '../namespaces';
16
- import { rgbToHex, hslToHex, hslRegex, rgbRegex, hexRegex, hex3Regex, hex3ToHex, } from '../utils/color-conversion';
17
- import { pixelToEMU, pixelRegex, TWIPToEMU, percentageRegex, pointRegex, pointToHIP, HIPToTWIP, pointToTWIP, pixelToHIP, pixelToTWIP, pixelToEIP, pointToEIP, cmToTWIP, cmRegex, inchRegex, inchToTWIP, } from '../utils/unit-conversion';
18
- // FIXME: remove the cyclic dependency
19
- // eslint-disable-next-line import/no-cycle
20
- import { defaultFont, hyperlinkType, paragraphBordersObject, colorlessColors, verticalAlignValues, imageType, internalRelationship, } from '../constants';
21
- import { vNodeHasChildren } from '../utils/vnode';
22
- import { isValidUrl } from '../utils/url';
23
- // eslint-disable-next-line consistent-return
24
- const fixupColorCode = (colorCodeString) => {
25
- if (Object.prototype.hasOwnProperty.call(colorNames, colorCodeString.toLowerCase())) {
26
- const [red, green, blue] = colorNames[colorCodeString.toLowerCase()];
27
- return rgbToHex(red, green, blue);
28
- }
29
- else if (rgbRegex.test(colorCodeString)) {
30
- const matchedParts = colorCodeString.match(rgbRegex);
31
- const red = matchedParts[1];
32
- const green = matchedParts[2];
33
- const blue = matchedParts[3];
34
- return rgbToHex(red, green, blue);
35
- }
36
- else if (hslRegex.test(colorCodeString)) {
37
- const matchedParts = colorCodeString.match(hslRegex);
38
- const hue = matchedParts[1];
39
- const saturation = matchedParts[2];
40
- const luminosity = matchedParts[3];
41
- return hslToHex(hue, saturation, luminosity);
42
- }
43
- else if (hexRegex.test(colorCodeString)) {
44
- const matchedParts = colorCodeString.match(hexRegex);
45
- return matchedParts[1];
46
- }
47
- else if (hex3Regex.test(colorCodeString)) {
48
- const matchedParts = colorCodeString.match(hex3Regex);
49
- const red = matchedParts[1];
50
- const green = matchedParts[2];
51
- const blue = matchedParts[3];
52
- return hex3ToHex(red, green, blue);
53
- }
54
- else {
55
- return '000000';
56
- }
57
- };
58
- const buildRunFontFragment = (fontName = defaultFont) => fragment({ namespaceAlias: { w: namespaces.w } })
59
- .ele('@w', 'rFonts')
60
- .att('@w', 'ascii', fontName)
61
- .att('@w', 'hAnsi', fontName)
62
- .up();
63
- const buildRunStyleFragment = (type = 'Hyperlink') => fragment({ namespaceAlias: { w: namespaces.w } })
64
- .ele('@w', 'rStyle')
65
- .att('@w', 'val', type)
66
- .up();
67
- const buildTableRowHeight = (tableRowHeight) => fragment({ namespaceAlias: { w: namespaces.w } })
68
- .ele('@w', 'trHeight')
69
- .att('@w', 'val', tableRowHeight)
70
- .att('@w', 'hRule', 'atLeast')
71
- .up();
72
- const buildVerticalAlignment = (verticalAlignment) => {
73
- if (verticalAlignment.toLowerCase() === 'middle') {
74
- verticalAlignment = 'center';
75
- }
76
- return fragment({ namespaceAlias: { w: namespaces.w } })
77
- .ele('@w', 'vAlign')
78
- .att('@w', 'val', verticalAlignment)
79
- .up();
80
- };
81
- const buildVerticalMerge = (verticalMerge = 'continue') => fragment({ namespaceAlias: { w: namespaces.w } })
82
- .ele('@w', 'vMerge')
83
- .att('@w', 'val', verticalMerge)
84
- .up();
85
- const buildColor = (colorCode) => fragment({ namespaceAlias: { w: namespaces.w } })
86
- .ele('@w', 'color')
87
- .att('@w', 'val', colorCode)
88
- .up();
89
- const buildFontSize = (fontSize) => fragment({ namespaceAlias: { w: namespaces.w } })
90
- .ele('@w', 'sz')
91
- .att('@w', 'val', fontSize)
92
- .up();
93
- const buildShading = (colorCode) => fragment({ namespaceAlias: { w: namespaces.w } })
94
- .ele('@w', 'shd')
95
- .att('@w', 'val', 'clear')
96
- .att('@w', 'fill', colorCode)
97
- .up();
98
- const buildHighlight = (color = 'yellow') => fragment({ namespaceAlias: { w: namespaces.w } })
99
- .ele('@w', 'highlight')
100
- .att('@w', 'val', color)
101
- .up();
102
- const buildVertAlign = (type = 'baseline') => fragment({ namespaceAlias: { w: namespaces.w } })
103
- .ele('@w', 'vertAlign')
104
- .att('@w', 'val', type)
105
- .up();
106
- const buildStrike = () => fragment({ namespaceAlias: { w: namespaces.w } })
107
- .ele('@w', 'strike')
108
- .att('@w', 'val', true)
109
- .up();
110
- const buildBold = () => fragment({ namespaceAlias: { w: namespaces.w } })
111
- .ele('@w', 'b')
112
- .up();
113
- const buildItalics = () => fragment({ namespaceAlias: { w: namespaces.w } })
114
- .ele('@w', 'i')
115
- .up();
116
- const buildUnderline = (type = 'single') => fragment({ namespaceAlias: { w: namespaces.w } })
117
- .ele('@w', 'u')
118
- .att('@w', 'val', type)
119
- .up();
120
- const buildLineBreak = (type = 'textWrapping') => fragment({ namespaceAlias: { w: namespaces.w } })
121
- .ele('@w', 'br')
122
- .att('@w', 'type', type)
123
- .up();
124
- const buildBorder = (borderSide = 'top', borderSize = 0, borderSpacing = 0, borderColor = fixupColorCode('black'), borderStroke = 'single') => fragment({ namespaceAlias: { w: namespaces.w } })
125
- .ele('@w', borderSide)
126
- .att('@w', 'val', borderStroke)
127
- .att('@w', 'sz', borderSize)
128
- .att('@w', 'space', borderSpacing)
129
- .att('@w', 'color', borderColor)
130
- .up();
131
- const buildTextElement = (text) => fragment({ namespaceAlias: { w: namespaces.w } })
132
- .ele('@w', 't')
133
- .att('@xml', 'space', 'preserve')
134
- .txt(text)
135
- .up();
136
- // eslint-disable-next-line consistent-return
137
- const fixupLineHeight = (lineHeight, fontSize) => {
138
- // FIXME: If line height is anything other than a number
139
- // eslint-disable-next-line no-restricted-globals
140
- if (!isNaN(lineHeight)) {
141
- if (fontSize) {
142
- const actualLineHeight = +lineHeight * fontSize;
143
- return HIPToTWIP(actualLineHeight);
144
- }
145
- else {
146
- // 240 TWIP or 12 point is default line height
147
- return +lineHeight * 240;
148
- }
149
- }
150
- else {
151
- // 240 TWIP or 12 point is default line height
152
- return 240;
153
- }
154
- };
155
- // eslint-disable-next-line consistent-return
156
- const fixupFontSize = (fontSizeString) => {
157
- if (pointRegex.test(fontSizeString)) {
158
- const matchedParts = fontSizeString.match(pointRegex);
159
- // convert point to half point
160
- return pointToHIP(matchedParts[1]);
161
- }
162
- else if (pixelRegex.test(fontSizeString)) {
163
- const matchedParts = fontSizeString.match(pixelRegex);
164
- // convert pixels to half point
165
- return pixelToHIP(matchedParts[1]);
166
- }
167
- };
168
- // eslint-disable-next-line consistent-return
169
- const fixupRowHeight = (rowHeightString) => {
170
- if (pointRegex.test(rowHeightString)) {
171
- const matchedParts = rowHeightString.match(pointRegex);
172
- // convert point to half point
173
- return pointToTWIP(matchedParts[1]);
174
- }
175
- else if (pixelRegex.test(rowHeightString)) {
176
- const matchedParts = rowHeightString.match(pixelRegex);
177
- // convert pixels to half point
178
- return pixelToTWIP(matchedParts[1]);
179
- }
180
- else if (cmRegex.test(rowHeightString)) {
181
- const matchedParts = rowHeightString.match(cmRegex);
182
- return cmToTWIP(matchedParts[1]);
183
- }
184
- else if (inchRegex.test(rowHeightString)) {
185
- const matchedParts = rowHeightString.match(inchRegex);
186
- return inchToTWIP(matchedParts[1]);
187
- }
188
- };
189
- // eslint-disable-next-line consistent-return
190
- const fixupColumnWidth = (columnWidthString) => {
191
- if (pointRegex.test(columnWidthString)) {
192
- const matchedParts = columnWidthString.match(pointRegex);
193
- return pointToTWIP(matchedParts[1]);
194
- }
195
- else if (pixelRegex.test(columnWidthString)) {
196
- const matchedParts = columnWidthString.match(pixelRegex);
197
- return pixelToTWIP(matchedParts[1]);
198
- }
199
- else if (cmRegex.test(columnWidthString)) {
200
- const matchedParts = columnWidthString.match(cmRegex);
201
- return cmToTWIP(matchedParts[1]);
202
- }
203
- else if (inchRegex.test(columnWidthString)) {
204
- const matchedParts = columnWidthString.match(inchRegex);
205
- return inchToTWIP(matchedParts[1]);
206
- }
207
- };
208
- // eslint-disable-next-line consistent-return
209
- const fixupMargin = (marginString) => {
210
- if (pointRegex.test(marginString)) {
211
- const matchedParts = marginString.match(pointRegex);
212
- // convert point to half point
213
- return pointToTWIP(matchedParts[1]);
214
- }
215
- else if (pixelRegex.test(marginString)) {
216
- const matchedParts = marginString.match(pixelRegex);
217
- // convert pixels to half point
218
- return pixelToTWIP(matchedParts[1]);
219
- }
220
- };
221
- const modifiedStyleAttributesBuilder = (vNode, attributes, options) => {
222
- const modifiedAttributes = { ...attributes };
223
- // styles
224
- if (isVNode(vNode) && vNode.properties && vNode.properties.style) {
225
- if (vNode.properties.style.color && !colorlessColors.includes(vNode.properties.style.color)) {
226
- modifiedAttributes.color = fixupColorCode(vNode.properties.style.color);
227
- }
228
- if (vNode.properties.style['background-color'] &&
229
- !colorlessColors.includes(vNode.properties.style['background-color'])) {
230
- modifiedAttributes.backgroundColor = fixupColorCode(vNode.properties.style['background-color']);
231
- }
232
- if (vNode.properties.style['vertical-align'] &&
233
- verticalAlignValues.includes(vNode.properties.style['vertical-align'])) {
234
- modifiedAttributes.verticalAlign = vNode.properties.style['vertical-align'];
235
- }
236
- if (vNode.properties.style['text-align'] &&
237
- ['left', 'right', 'center', 'justify'].includes(vNode.properties.style['text-align'])) {
238
- modifiedAttributes.textAlign = vNode.properties.style['text-align'];
239
- }
240
- // FIXME: remove bold check when other font weights are handled.
241
- if (vNode.properties.style['font-weight'] && vNode.properties.style['font-weight'] === 'bold') {
242
- modifiedAttributes.strong = vNode.properties.style['font-weight'];
243
- }
244
- if (vNode.properties.style['font-size']) {
245
- modifiedAttributes.fontSize = fixupFontSize(vNode.properties.style['font-size']);
246
- }
247
- if (vNode.properties.style['line-height']) {
248
- modifiedAttributes.lineHeight = fixupLineHeight(vNode.properties.style['line-height'], vNode.properties.style['font-size']
249
- ? fixupFontSize(vNode.properties.style['font-size'])
250
- : null);
251
- }
252
- if (vNode.properties.style['margin-left'] || vNode.properties.style['margin-right']) {
253
- const leftMargin = fixupMargin(vNode.properties.style['margin-left']);
254
- const rightMargin = fixupMargin(vNode.properties.style['margin-right']);
255
- const indentation = {};
256
- if (leftMargin) {
257
- indentation.left = leftMargin;
258
- }
259
- if (rightMargin) {
260
- indentation.right = rightMargin;
261
- }
262
- if (leftMargin || rightMargin) {
263
- modifiedAttributes.indentation = indentation;
264
- }
265
- }
266
- if (vNode.properties.style.display) {
267
- modifiedAttributes.display = vNode.properties.style.display;
268
- }
269
- if (vNode.properties.style.width) {
270
- modifiedAttributes.width = vNode.properties.style.width;
271
- }
272
- }
273
- // paragraph only
274
- if (options && options.isParagraph) {
275
- if (isVNode(vNode) && vNode.tagName === 'blockquote') {
276
- modifiedAttributes.indentation = { left: 284 };
277
- modifiedAttributes.textAlign = 'justify';
278
- }
279
- else if (isVNode(vNode) && vNode.tagName === 'code') {
280
- modifiedAttributes.highlightColor = 'lightGray';
281
- }
282
- else if (isVNode(vNode) && vNode.tagName === 'pre') {
283
- modifiedAttributes.font = 'Courier';
284
- }
285
- }
286
- return modifiedAttributes;
287
- };
288
- // html tag to formatting function
289
- // options are passed to the formatting function if needed
290
- const buildFormatting = (htmlTag, options) => {
291
- switch (htmlTag) {
292
- case 'strong':
293
- case 'b':
294
- return buildBold();
295
- case 'em':
296
- case 'i':
297
- return buildItalics();
298
- case 'ins':
299
- case 'u':
300
- return buildUnderline();
301
- case 'strike':
302
- case 'del':
303
- case 's':
304
- return buildStrike();
305
- case 'sub':
306
- return buildVertAlign('subscript');
307
- case 'sup':
308
- return buildVertAlign('superscript');
309
- case 'mark':
310
- return buildHighlight();
311
- case 'code':
312
- return buildHighlight('lightGray');
313
- case 'highlightColor':
314
- return buildHighlight(options && options.color ? options.color : 'lightGray');
315
- case 'font':
316
- case 'pre':
317
- return buildRunFontFragment('Courier');
318
- case 'color':
319
- return buildColor(options && options.color ? options.color : 'black');
320
- case 'backgroundColor':
321
- return buildShading(options && options.color ? options.color : 'black');
322
- case 'fontSize':
323
- // does this need a unit of measure?
324
- return buildFontSize(options && options.fontSize ? options.fontSize : 10);
325
- case 'hyperlink':
326
- return buildRunStyleFragment('Hyperlink');
327
- }
328
- return null;
329
- };
330
- const buildRunProperties = (attributes) => {
331
- const runPropertiesFragment = fragment({ namespaceAlias: { w: namespaces.w } }).ele('@w', 'rPr');
332
- if (attributes && attributes.constructor === Object) {
333
- Object.keys(attributes).forEach((key) => {
334
- const options = {};
335
- if (key === 'color' || key === 'backgroundColor' || key === 'highlightColor') {
336
- options.color = attributes[key];
337
- }
338
- if (key === 'fontSize') {
339
- options.fontSize = attributes[key];
340
- }
341
- const formattingFragment = buildFormatting(key, options);
342
- if (formattingFragment) {
343
- runPropertiesFragment.import(formattingFragment);
344
- }
345
- });
346
- }
347
- runPropertiesFragment.up();
348
- return runPropertiesFragment;
349
- };
350
- const buildRun = async (vNode, attributes, docxDocumentInstance) => {
351
- const runFragment = fragment({ namespaceAlias: { w: namespaces.w } }).ele('@w', 'r');
352
- const runPropertiesFragment = buildRunProperties(cloneDeep(attributes));
353
- // case where we have recursive spans representing font changes
354
- if (isVNode(vNode) && vNode.tagName === 'span') {
355
- // eslint-disable-next-line no-use-before-define
356
- return buildRunOrRuns(vNode, attributes, docxDocumentInstance);
357
- }
358
- if (isVNode(vNode) &&
359
- [
360
- 'strong',
361
- 'b',
362
- 'em',
363
- 'i',
364
- 'u',
365
- 'ins',
366
- 'strike',
367
- 'del',
368
- 's',
369
- 'sub',
370
- 'sup',
371
- 'mark',
372
- 'blockquote',
373
- 'code',
374
- 'pre',
375
- ].includes(vNode.tagName)) {
376
- const runFragmentsArray = [];
377
- let vNodes = [vNode];
378
- // create temp run fragments to split the paragraph into different runs
379
- let tempAttributes = cloneDeep(attributes);
380
- let tempRunFragment = fragment({ namespaceAlias: { w: namespaces.w } }).ele('@w', 'r');
381
- while (vNodes.length) {
382
- const tempVNode = vNodes.shift();
383
- if (isVText(tempVNode)) {
384
- const textFragment = buildTextElement(tempVNode.text);
385
- const tempRunPropertiesFragment = buildRunProperties({ ...attributes, ...tempAttributes });
386
- tempRunFragment.import(tempRunPropertiesFragment);
387
- tempRunFragment.import(textFragment);
388
- runFragmentsArray.push(tempRunFragment);
389
- // re initialize temp run fragments with new fragment
390
- tempAttributes = cloneDeep(attributes);
391
- tempRunFragment = fragment({ namespaceAlias: { w: namespaces.w } }).ele('@w', 'r');
392
- }
393
- else if (isVNode(tempVNode)) {
394
- if ([
395
- 'strong',
396
- 'b',
397
- 'em',
398
- 'i',
399
- 'u',
400
- 'ins',
401
- 'strike',
402
- 'del',
403
- 's',
404
- 'sub',
405
- 'sup',
406
- 'mark',
407
- 'code',
408
- 'pre',
409
- ].includes(tempVNode.tagName)) {
410
- tempAttributes = {};
411
- switch (tempVNode.tagName) {
412
- case 'strong':
413
- case 'b':
414
- tempAttributes.strong = true;
415
- break;
416
- case 'i':
417
- tempAttributes.i = true;
418
- break;
419
- case 'u':
420
- tempAttributes.u = true;
421
- break;
422
- case 'sub':
423
- tempAttributes.sub = true;
424
- break;
425
- case 'sup':
426
- tempAttributes.sup = true;
427
- break;
428
- }
429
- const formattingFragment = buildFormatting(tempVNode);
430
- if (formattingFragment) {
431
- runPropertiesFragment.import(formattingFragment);
432
- }
433
- // go a layer deeper if there is a span somewhere in the children
434
- }
435
- else if (tempVNode.tagName === 'span') {
436
- // eslint-disable-next-line no-use-before-define
437
- const spanFragment = await buildRunOrRuns(tempVNode, { ...attributes, ...tempAttributes }, docxDocumentInstance);
438
- // if spanFragment is an array, we need to add each fragment to the runFragmentsArray. If the fragment is an array, perform a depth first search on the array to add each fragment to the runFragmentsArray
439
- if (Array.isArray(spanFragment)) {
440
- spanFragment.flat(Infinity);
441
- runFragmentsArray.push(...spanFragment);
442
- }
443
- else {
444
- runFragmentsArray.push(spanFragment);
445
- }
446
- // do not slice and concat children since this is already accounted for in the buildRunOrRuns function
447
- // eslint-disable-next-line no-continue
448
- continue;
449
- }
450
- }
451
- if (tempVNode.children && tempVNode.children.length) {
452
- if (tempVNode.children.length > 1) {
453
- attributes = { ...attributes, ...tempAttributes };
454
- }
455
- vNodes = tempVNode.children.slice().concat(vNodes);
456
- }
457
- }
458
- if (runFragmentsArray.length) {
459
- return runFragmentsArray;
460
- }
461
- }
462
- runFragment.import(runPropertiesFragment);
463
- if (isVText(vNode)) {
464
- const textFragment = buildTextElement(vNode.text);
465
- runFragment.import(textFragment);
466
- }
467
- else if (attributes && attributes.type === 'picture') {
468
- let response = null;
469
- const base64Uri = decodeURIComponent(vNode.properties.src);
470
- if (base64Uri) {
471
- response = docxDocumentInstance.createMediaFile(base64Uri);
472
- }
473
- if (response) {
474
- docxDocumentInstance.zip
475
- .folder('word')
476
- .folder('media')
477
- .file(response.fileNameWithExtension, Buffer.from(response.fileContent, 'base64'), {
478
- createFolders: false,
479
- });
480
- const documentRelsId = docxDocumentInstance.createDocumentRelationships(docxDocumentInstance.relationshipFilename, imageType, `media/${response.fileNameWithExtension}`, internalRelationship);
481
- attributes.inlineOrAnchored = true;
482
- attributes.relationshipId = documentRelsId;
483
- attributes.id = response.id;
484
- attributes.fileContent = response.fileContent;
485
- attributes.fileNameWithExtension = response.fileNameWithExtension;
486
- }
487
- const { type, inlineOrAnchored, ...otherAttributes } = attributes;
488
- // eslint-disable-next-line no-use-before-define
489
- const imageFragment = buildDrawing(inlineOrAnchored, type, otherAttributes);
490
- runFragment.import(imageFragment);
491
- }
492
- else if (isVNode(vNode) && vNode.tagName === 'br') {
493
- const lineBreakFragment = buildLineBreak();
494
- runFragment.import(lineBreakFragment);
495
- }
496
- runFragment.up();
497
- return runFragment;
498
- };
499
- const buildRunOrRuns = async (vNode, attributes, docxDocumentInstance) => {
500
- if (isVNode(vNode) && vNode.tagName === 'span') {
501
- let runFragments = [];
502
- for (let index = 0; index < vNode.children.length; index++) {
503
- const childVNode = vNode.children[index];
504
- const modifiedAttributes = modifiedStyleAttributesBuilder(vNode, attributes);
505
- const tempRunFragments = await buildRun(childVNode, modifiedAttributes, docxDocumentInstance);
506
- runFragments = runFragments.concat(Array.isArray(tempRunFragments) ? tempRunFragments : [tempRunFragments]);
507
- }
508
- return runFragments;
509
- }
510
- else {
511
- const tempRunFragments = await buildRun(vNode, attributes, docxDocumentInstance);
512
- return tempRunFragments;
513
- }
514
- };
515
- const buildRunOrHyperLink = async (vNode, attributes, docxDocumentInstance) => {
516
- if (isVNode(vNode) && vNode.tagName === 'a') {
517
- const relationshipId = docxDocumentInstance.createDocumentRelationships(docxDocumentInstance.relationshipFilename, hyperlinkType, vNode.properties && vNode.properties.href ? vNode.properties.href : '');
518
- const hyperlinkFragment = fragment({ namespaceAlias: { w: namespaces.w, r: namespaces.r } })
519
- .ele('@w', 'hyperlink')
520
- .att('@r', 'id', `rId${relationshipId}`);
521
- const modifiedAttributes = { ...attributes };
522
- modifiedAttributes.hyperlink = true;
523
- const runFragments = await buildRunOrRuns(vNode.children[0], modifiedAttributes, docxDocumentInstance);
524
- if (Array.isArray(runFragments)) {
525
- for (let index = 0; index < runFragments.length; index++) {
526
- const runFragment = runFragments[index];
527
- hyperlinkFragment.import(runFragment);
528
- }
529
- }
530
- else {
531
- hyperlinkFragment.import(runFragments);
532
- }
533
- hyperlinkFragment.up();
534
- return hyperlinkFragment;
535
- }
536
- const runFragments = await buildRunOrRuns(vNode, attributes, docxDocumentInstance);
537
- return runFragments;
538
- };
539
- const buildNumberingProperties = (levelId, numberingId) => fragment({ namespaceAlias: { w: namespaces.w } })
540
- .ele('@w', 'numPr')
541
- .ele('@w', 'ilvl')
542
- .att('@w', 'val', String(levelId))
543
- .up()
544
- .ele('@w', 'numId')
545
- .att('@w', 'val', String(numberingId))
546
- .up()
547
- .up();
548
- const buildNumberingInstances = () => fragment({ namespaceAlias: { w: namespaces.w } })
549
- .ele('@w', 'num')
550
- .ele('@w', 'abstractNumId')
551
- .up()
552
- .up();
553
- const buildSpacing = (lineSpacing, beforeSpacing, afterSpacing) => {
554
- const spacingFragment = fragment({ namespaceAlias: { w: namespaces.w } }).ele('@w', 'spacing');
555
- if (lineSpacing) {
556
- spacingFragment.att('@w', 'line', lineSpacing);
557
- }
558
- if (beforeSpacing) {
559
- spacingFragment.att('@w', 'before', beforeSpacing);
560
- }
561
- if (afterSpacing) {
562
- spacingFragment.att('@w', 'after', afterSpacing);
563
- }
564
- spacingFragment.att('@w', 'lineRule', 'auto').up();
565
- return spacingFragment;
566
- };
567
- const buildIndentation = ({ left, right }) => {
568
- const indentationFragment = fragment({
569
- namespaceAlias: { w: namespaces.w },
570
- }).ele('@w', 'ind');
571
- if (left) {
572
- indentationFragment.att('@w', 'left', left);
573
- }
574
- if (right) {
575
- indentationFragment.att('@w', 'right', right);
576
- }
577
- indentationFragment.up();
578
- return indentationFragment;
579
- };
580
- const buildPStyle = (style = 'Normal') => fragment({ namespaceAlias: { w: namespaces.w } })
581
- .ele('@w', 'pStyle')
582
- .att('@w', 'val', style)
583
- .up();
584
- const buildHorizontalAlignment = (horizontalAlignment) => {
585
- if (horizontalAlignment === 'justify') {
586
- horizontalAlignment = 'both';
587
- }
588
- return fragment({ namespaceAlias: { w: namespaces.w } })
589
- .ele('@w', 'jc')
590
- .att('@w', 'val', horizontalAlignment)
591
- .up();
592
- };
593
- const buildParagraphBorder = () => {
594
- const paragraphBorderFragment = fragment({ namespaceAlias: { w: namespaces.w } }).ele('@w', 'pBdr');
595
- const bordersObject = cloneDeep(paragraphBordersObject);
596
- Object.keys(bordersObject).forEach((borderName) => {
597
- if (bordersObject[borderName]) {
598
- const { size, spacing, color } = bordersObject[borderName];
599
- const borderFragment = buildBorder(borderName, size, spacing, color);
600
- paragraphBorderFragment.import(borderFragment);
601
- }
602
- });
603
- paragraphBorderFragment.up();
604
- return paragraphBorderFragment;
605
- };
606
- const buildParagraphProperties = (attributes) => {
607
- const paragraphPropertiesFragment = fragment({ namespaceAlias: { w: namespaces.w } }).ele('@w', 'pPr');
608
- if (attributes && attributes.constructor === Object) {
609
- Object.keys(attributes).forEach((key) => {
610
- switch (key) {
611
- case 'numbering':
612
- const { levelId, numberingId } = attributes[key];
613
- const numberingPropertiesFragment = buildNumberingProperties(levelId, numberingId);
614
- paragraphPropertiesFragment.import(numberingPropertiesFragment);
615
- // eslint-disable-next-line no-param-reassign
616
- delete attributes.numbering;
617
- break;
618
- case 'textAlign':
619
- const horizontalAlignmentFragment = buildHorizontalAlignment(attributes[key]);
620
- paragraphPropertiesFragment.import(horizontalAlignmentFragment);
621
- // eslint-disable-next-line no-param-reassign
622
- delete attributes.textAlign;
623
- break;
624
- case 'backgroundColor':
625
- // Add shading to Paragraph Properties only if display is block
626
- // Essentially if background color needs to be across the row
627
- if (attributes.display === 'block') {
628
- const shadingFragment = buildShading(attributes[key]);
629
- paragraphPropertiesFragment.import(shadingFragment);
630
- // FIXME: Inner padding in case of shaded paragraphs.
631
- const paragraphBorderFragment = buildParagraphBorder();
632
- paragraphPropertiesFragment.import(paragraphBorderFragment);
633
- // eslint-disable-next-line no-param-reassign
634
- delete attributes.backgroundColor;
635
- }
636
- break;
637
- case 'paragraphStyle':
638
- const pStyleFragment = buildPStyle(attributes.paragraphStyle);
639
- paragraphPropertiesFragment.import(pStyleFragment);
640
- delete attributes.paragraphStyle;
641
- break;
642
- case 'indentation':
643
- const indentationFragment = buildIndentation(attributes[key]);
644
- paragraphPropertiesFragment.import(indentationFragment);
645
- // eslint-disable-next-line no-param-reassign
646
- delete attributes.indentation;
647
- break;
648
- }
649
- });
650
- const spacingFragment = buildSpacing(attributes.lineHeight, attributes.beforeSpacing, attributes.afterSpacing);
651
- // eslint-disable-next-line no-param-reassign
652
- delete attributes.lineHeight;
653
- // eslint-disable-next-line no-param-reassign
654
- delete attributes.beforeSpacing;
655
- // eslint-disable-next-line no-param-reassign
656
- delete attributes.afterSpacing;
657
- paragraphPropertiesFragment.import(spacingFragment);
658
- }
659
- paragraphPropertiesFragment.up();
660
- return paragraphPropertiesFragment;
661
- };
662
- const computeImageDimensions = (vNode, attributes) => {
663
- const { maximumWidth, originalWidth, originalHeight } = attributes;
664
- const aspectRatio = originalWidth / originalHeight;
665
- const maximumWidthInEMU = TWIPToEMU(maximumWidth);
666
- let originalWidthInEMU = pixelToEMU(originalWidth);
667
- let originalHeightInEMU = pixelToEMU(originalHeight);
668
- if (originalWidthInEMU > maximumWidthInEMU) {
669
- originalWidthInEMU = maximumWidthInEMU;
670
- originalHeightInEMU = Math.round(originalWidthInEMU / aspectRatio);
671
- }
672
- let modifiedHeight;
673
- let modifiedWidth;
674
- if (vNode.properties && vNode.properties.style) {
675
- if (vNode.properties.style.width) {
676
- if (vNode.properties.style.width !== 'auto') {
677
- if (pixelRegex.test(vNode.properties.style.width)) {
678
- modifiedWidth = pixelToEMU(vNode.properties.style.width.match(pixelRegex)[1]);
679
- }
680
- else if (percentageRegex.test(vNode.properties.style.width)) {
681
- const percentageValue = vNode.properties.style.width.match(percentageRegex)[1];
682
- modifiedWidth = Math.round((percentageValue / 100) * originalWidthInEMU);
683
- }
684
- }
685
- else {
686
- // eslint-disable-next-line no-lonely-if
687
- if (vNode.properties.style.height && vNode.properties.style.height === 'auto') {
688
- modifiedWidth = originalWidthInEMU;
689
- modifiedHeight = originalHeightInEMU;
690
- }
691
- }
692
- }
693
- if (vNode.properties.style.height) {
694
- if (vNode.properties.style.height !== 'auto') {
695
- if (pixelRegex.test(vNode.properties.style.height)) {
696
- modifiedHeight = pixelToEMU(vNode.properties.style.height.match(pixelRegex)[1]);
697
- }
698
- else if (percentageRegex.test(vNode.properties.style.height)) {
699
- const percentageValue = vNode.properties.style.width.match(percentageRegex)[1];
700
- modifiedHeight = Math.round((percentageValue / 100) * originalHeightInEMU);
701
- if (!modifiedWidth) {
702
- modifiedWidth = Math.round(modifiedHeight * aspectRatio);
703
- }
704
- }
705
- }
706
- else {
707
- // eslint-disable-next-line no-lonely-if
708
- if (modifiedWidth) {
709
- if (!modifiedHeight) {
710
- modifiedHeight = Math.round(modifiedWidth / aspectRatio);
711
- }
712
- }
713
- else {
714
- modifiedHeight = originalHeightInEMU;
715
- modifiedWidth = originalWidthInEMU;
716
- }
717
- }
718
- }
719
- if (modifiedWidth && !modifiedHeight) {
720
- modifiedHeight = Math.round(modifiedWidth / aspectRatio);
721
- }
722
- else if (modifiedHeight && !modifiedWidth) {
723
- modifiedWidth = Math.round(modifiedHeight * aspectRatio);
724
- }
725
- }
726
- else {
727
- modifiedWidth = originalWidthInEMU;
728
- modifiedHeight = originalHeightInEMU;
729
- }
730
- // eslint-disable-next-line no-param-reassign
731
- attributes.width = modifiedWidth;
732
- // eslint-disable-next-line no-param-reassign
733
- attributes.height = modifiedHeight;
734
- };
735
- const buildParagraph = async (vNode, attributes, docxDocumentInstance) => {
736
- const paragraphFragment = fragment({ namespaceAlias: { w: namespaces.w } }).ele('@w', 'p');
737
- const modifiedAttributes = modifiedStyleAttributesBuilder(vNode, attributes, {
738
- isParagraph: true,
739
- });
740
- const paragraphPropertiesFragment = buildParagraphProperties(modifiedAttributes);
741
- paragraphFragment.import(paragraphPropertiesFragment);
742
- if (isVNode(vNode) && vNodeHasChildren(vNode)) {
743
- if ([
744
- 'span',
745
- 'strong',
746
- 'b',
747
- 'em',
748
- 'i',
749
- 'u',
750
- 'ins',
751
- 'strike',
752
- 'del',
753
- 's',
754
- 'sub',
755
- 'sup',
756
- 'mark',
757
- 'a',
758
- 'code',
759
- 'pre',
760
- ].includes(vNode.tagName)) {
761
- const runOrHyperlinkFragments = await buildRunOrHyperLink(vNode, modifiedAttributes, docxDocumentInstance);
762
- if (Array.isArray(runOrHyperlinkFragments)) {
763
- for (let iteratorIndex = 0; iteratorIndex < runOrHyperlinkFragments.length; iteratorIndex++) {
764
- const runOrHyperlinkFragment = runOrHyperlinkFragments[iteratorIndex];
765
- paragraphFragment.import(runOrHyperlinkFragment);
766
- }
767
- }
768
- else {
769
- paragraphFragment.import(runOrHyperlinkFragments);
770
- }
771
- }
772
- else if (vNode.tagName === 'blockquote') {
773
- const runFragmentOrFragments = await buildRun(vNode, attributes);
774
- if (Array.isArray(runFragmentOrFragments)) {
775
- for (let index = 0; index < runFragmentOrFragments.length; index++) {
776
- paragraphFragment.import(runFragmentOrFragments[index]);
777
- }
778
- }
779
- else {
780
- paragraphFragment.import(runFragmentOrFragments);
781
- }
782
- }
783
- else {
784
- for (let index = 0; index < vNode.children.length; index++) {
785
- const childVNode = vNode.children[index];
786
- if (childVNode.tagName === 'img') {
787
- let base64String;
788
- const imageSource = childVNode.properties.src;
789
- if (isValidUrl(imageSource)) {
790
- base64String = await imageToBase64(imageSource).catch((error) => {
791
- // eslint-disable-next-line no-console
792
- console.warning(`skipping image download and conversion due to ${error}`);
793
- });
794
- if (base64String && mimeTypes.lookup(imageSource)) {
795
- childVNode.properties.src = `data:${mimeTypes.lookup(imageSource)};base64, ${base64String}`;
796
- }
797
- else {
798
- break;
799
- }
800
- }
801
- else {
802
- // eslint-disable-next-line no-useless-escape, prefer-destructuring
803
- base64String = imageSource.match(/^data:([A-Za-z-+\/]+);base64,(.+)$/)[2];
804
- }
805
- const imageBuffer = Buffer.from(decodeURIComponent(base64String), 'base64');
806
- const imageProperties = sizeOf(imageBuffer);
807
- modifiedAttributes.maximumWidth =
808
- modifiedAttributes.maximumWidth || docxDocumentInstance.availableDocumentSpace;
809
- modifiedAttributes.originalWidth = imageProperties.width;
810
- modifiedAttributes.originalHeight = imageProperties.height;
811
- computeImageDimensions(childVNode, modifiedAttributes);
812
- }
813
- const runOrHyperlinkFragments = await buildRunOrHyperLink(childVNode, isVNode(childVNode) && childVNode.tagName === 'img'
814
- ? { ...modifiedAttributes, type: 'picture' }
815
- : modifiedAttributes, docxDocumentInstance);
816
- if (Array.isArray(runOrHyperlinkFragments)) {
817
- for (let iteratorIndex = 0; iteratorIndex < runOrHyperlinkFragments.length; iteratorIndex++) {
818
- const runOrHyperlinkFragment = runOrHyperlinkFragments[iteratorIndex];
819
- paragraphFragment.import(runOrHyperlinkFragment);
820
- }
821
- }
822
- else {
823
- paragraphFragment.import(runOrHyperlinkFragments);
824
- }
825
- }
826
- }
827
- }
828
- else {
829
- // In case paragraphs has to be rendered where vText is present. Eg. table-cell
830
- // Or in case the vNode is something like img
831
- if (isVNode(vNode) && vNode.tagName === 'img') {
832
- const imageSource = vNode.properties.src;
833
- let base64String = imageSource;
834
- if (isValidUrl(imageSource)) {
835
- base64String = await imageToBase64(imageSource).catch((error) => {
836
- // eslint-disable-next-line no-console
837
- console.warning(`skipping image download and conversion due to ${error}`);
838
- });
839
- if (base64String && mimeTypes.lookup(imageSource)) {
840
- vNode.properties.src = `data:${mimeTypes.lookup(imageSource)};base64, ${base64String}`;
841
- }
842
- else {
843
- paragraphFragment.up();
844
- return paragraphFragment;
845
- }
846
- }
847
- else {
848
- // eslint-disable-next-line no-useless-escape, prefer-destructuring
849
- base64String = base64String.match(/^data:([A-Za-z-+\/]+);base64,(.+)$/)[2];
850
- }
851
- const imageBuffer = Buffer.from(decodeURIComponent(base64String), 'base64');
852
- const imageProperties = sizeOf(imageBuffer);
853
- modifiedAttributes.maximumWidth =
854
- modifiedAttributes.maximumWidth || docxDocumentInstance.availableDocumentSpace;
855
- modifiedAttributes.originalWidth = imageProperties.width;
856
- modifiedAttributes.originalHeight = imageProperties.height;
857
- computeImageDimensions(vNode, modifiedAttributes);
858
- }
859
- const runFragments = await buildRunOrRuns(vNode, modifiedAttributes, docxDocumentInstance);
860
- if (Array.isArray(runFragments)) {
861
- for (let index = 0; index < runFragments.length; index++) {
862
- const runFragment = runFragments[index];
863
- paragraphFragment.import(runFragment);
864
- }
865
- }
866
- else {
867
- paragraphFragment.import(runFragments);
868
- }
869
- }
870
- paragraphFragment.up();
871
- return paragraphFragment;
872
- };
873
- const buildGridSpanFragment = (spanValue) => fragment({ namespaceAlias: { w: namespaces.w } })
874
- .ele('@w', 'gridSpan')
875
- .att('@w', 'val', spanValue)
876
- .up();
877
- const buildTableCellSpacing = (cellSpacing = 0) => fragment({ namespaceAlias: { w: namespaces.w } })
878
- .ele('@w', 'tblCellSpacing')
879
- .att('@w', 'w', cellSpacing)
880
- .att('@w', 'type', 'dxa')
881
- .up();
882
- const buildTableCellBorders = (tableCellBorder) => {
883
- const tableCellBordersFragment = fragment({ namespaceAlias: { w: namespaces.w } }).ele('@w', 'tcBorders');
884
- const { color, stroke, ...borders } = tableCellBorder;
885
- Object.keys(borders).forEach((border) => {
886
- if (tableCellBorder[border]) {
887
- const borderFragment = buildBorder(border, tableCellBorder[border], 0, color, stroke);
888
- tableCellBordersFragment.import(borderFragment);
889
- }
890
- });
891
- tableCellBordersFragment.up();
892
- return tableCellBordersFragment;
893
- };
894
- const buildTableCellWidth = (tableCellWidth) => fragment({ namespaceAlias: { w: namespaces.w } })
895
- .ele('@w', 'tcW')
896
- .att('@w', 'w', fixupColumnWidth(tableCellWidth))
897
- .att('@w', 'type', 'dxa')
898
- .up();
899
- const buildTableCellProperties = (attributes) => {
900
- const tableCellPropertiesFragment = fragment({ namespaceAlias: { w: namespaces.w } }).ele('@w', 'tcPr');
901
- if (attributes && attributes.constructor === Object) {
902
- Object.keys(attributes).forEach((key) => {
903
- switch (key) {
904
- case 'backgroundColor':
905
- const shadingFragment = buildShading(attributes[key]);
906
- tableCellPropertiesFragment.import(shadingFragment);
907
- // eslint-disable-next-line no-param-reassign
908
- delete attributes.backgroundColor;
909
- break;
910
- case 'verticalAlign':
911
- const verticalAlignmentFragment = buildVerticalAlignment(attributes[key]);
912
- tableCellPropertiesFragment.import(verticalAlignmentFragment);
913
- // eslint-disable-next-line no-param-reassign
914
- delete attributes.verticalAlign;
915
- break;
916
- case 'colSpan':
917
- const gridSpanFragment = buildGridSpanFragment(attributes[key]);
918
- tableCellPropertiesFragment.import(gridSpanFragment);
919
- // eslint-disable-next-line no-param-reassign
920
- delete attributes.colSpan;
921
- break;
922
- case 'tableCellBorder':
923
- const tableCellBorderFragment = buildTableCellBorders(attributes[key]);
924
- tableCellPropertiesFragment.import(tableCellBorderFragment);
925
- // eslint-disable-next-line no-param-reassign
926
- delete attributes.tableCellBorder;
927
- break;
928
- case 'rowSpan':
929
- const verticalMergeFragment = buildVerticalMerge(attributes[key]);
930
- tableCellPropertiesFragment.import(verticalMergeFragment);
931
- delete attributes.rowSpan;
932
- break;
933
- case 'width':
934
- const widthFragment = buildTableCellWidth(attributes[key]);
935
- tableCellPropertiesFragment.import(widthFragment);
936
- delete attributes.width;
937
- break;
938
- }
939
- });
940
- }
941
- tableCellPropertiesFragment.up();
942
- return tableCellPropertiesFragment;
943
- };
944
- const fixupTableCellBorder = (vNode, attributes) => {
945
- if (Object.prototype.hasOwnProperty.call(vNode.properties.style, 'border')) {
946
- if (vNode.properties.style.border === 'none' || vNode.properties.style.border === 0) {
947
- attributes.tableCellBorder = {};
948
- }
949
- else {
950
- // eslint-disable-next-line no-use-before-define
951
- const [borderSize, borderStroke, borderColor] = cssBorderParser(vNode.properties.style.border);
952
- attributes.tableCellBorder = {
953
- top: borderSize,
954
- left: borderSize,
955
- bottom: borderSize,
956
- right: borderSize,
957
- color: borderColor,
958
- stroke: borderStroke,
959
- };
960
- }
961
- }
962
- if (vNode.properties.style['border-top'] && vNode.properties.style['border-top'] === '0') {
963
- attributes.tableCellBorder = {
964
- ...attributes.tableCellBorder,
965
- top: 0,
966
- };
967
- }
968
- else if (vNode.properties.style['border-top'] && vNode.properties.style['border-top'] !== '0') {
969
- // eslint-disable-next-line no-use-before-define
970
- const [borderSize, borderStroke, borderColor] = cssBorderParser(vNode.properties.style['border-top']);
971
- attributes.tableCellBorder = {
972
- ...attributes.tableCellBorder,
973
- top: borderSize,
974
- color: borderColor,
975
- stroke: borderStroke,
976
- };
977
- }
978
- if (vNode.properties.style['border-left'] && vNode.properties.style['border-left'] === '0') {
979
- attributes.tableCellBorder = {
980
- ...attributes.tableCellBorder,
981
- left: 0,
982
- };
983
- }
984
- else if (vNode.properties.style['border-left'] &&
985
- vNode.properties.style['border-left'] !== '0') {
986
- // eslint-disable-next-line no-use-before-define
987
- const [borderSize, borderStroke, borderColor] = cssBorderParser(vNode.properties.style['border-left']);
988
- attributes.tableCellBorder = {
989
- ...attributes.tableCellBorder,
990
- left: borderSize,
991
- color: borderColor,
992
- stroke: borderStroke,
993
- };
994
- }
995
- if (vNode.properties.style['border-bottom'] && vNode.properties.style['border-bottom'] === '0') {
996
- attributes.tableCellBorder = {
997
- ...attributes.tableCellBorder,
998
- bottom: 0,
999
- };
1000
- }
1001
- else if (vNode.properties.style['border-bottom'] &&
1002
- vNode.properties.style['border-bottom'] !== '0') {
1003
- // eslint-disable-next-line no-use-before-define
1004
- const [borderSize, borderStroke, borderColor] = cssBorderParser(vNode.properties.style['border-bottom']);
1005
- attributes.tableCellBorder = {
1006
- ...attributes.tableCellBorder,
1007
- bottom: borderSize,
1008
- color: borderColor,
1009
- stroke: borderStroke,
1010
- };
1011
- }
1012
- if (vNode.properties.style['border-right'] && vNode.properties.style['border-right'] === '0') {
1013
- attributes.tableCellBorder = {
1014
- ...attributes.tableCellBorder,
1015
- right: 0,
1016
- };
1017
- }
1018
- else if (vNode.properties.style['border-right'] &&
1019
- vNode.properties.style['border-right'] !== '0') {
1020
- // eslint-disable-next-line no-use-before-define
1021
- const [borderSize, borderStroke, borderColor] = cssBorderParser(vNode.properties.style['border-right']);
1022
- attributes.tableCellBorder = {
1023
- ...attributes.tableCellBorder,
1024
- right: borderSize,
1025
- color: borderColor,
1026
- stroke: borderStroke,
1027
- };
1028
- }
1029
- };
1030
- const buildTableCell = async (vNode, attributes, rowSpanMap, columnIndex, docxDocumentInstance) => {
1031
- const tableCellFragment = fragment({ namespaceAlias: { w: namespaces.w } }).ele('@w', 'tc');
1032
- let modifiedAttributes = { ...attributes };
1033
- if (isVNode(vNode) && vNode.properties) {
1034
- if (vNode.properties.rowSpan) {
1035
- rowSpanMap.set(columnIndex.index, { rowSpan: vNode.properties.rowSpan - 1, colSpan: 0 });
1036
- modifiedAttributes.rowSpan = 'restart';
1037
- }
1038
- else {
1039
- const previousSpanObject = rowSpanMap.get(columnIndex.index);
1040
- rowSpanMap.set(columnIndex.index,
1041
- // eslint-disable-next-line prefer-object-spread
1042
- Object.assign({}, previousSpanObject, {
1043
- rowSpan: 0,
1044
- colSpan: (previousSpanObject && previousSpanObject.colSpan) || 0,
1045
- }));
1046
- }
1047
- if (vNode.properties.colSpan ||
1048
- (vNode.properties.style && vNode.properties.style['column-span'])) {
1049
- modifiedAttributes.colSpan =
1050
- vNode.properties.colSpan ||
1051
- (vNode.properties.style && vNode.properties.style['column-span']);
1052
- const previousSpanObject = rowSpanMap.get(columnIndex.index);
1053
- rowSpanMap.set(columnIndex.index,
1054
- // eslint-disable-next-line prefer-object-spread
1055
- Object.assign({}, previousSpanObject, {
1056
- colSpan: parseInt(modifiedAttributes.colSpan) || 0,
1057
- }));
1058
- columnIndex.index += parseInt(modifiedAttributes.colSpan) - 1;
1059
- }
1060
- if (vNode.properties.style) {
1061
- modifiedAttributes = {
1062
- ...modifiedAttributes,
1063
- ...modifiedStyleAttributesBuilder(vNode, attributes),
1064
- };
1065
- fixupTableCellBorder(vNode, modifiedAttributes);
1066
- }
1067
- }
1068
- const tableCellPropertiesFragment = buildTableCellProperties(modifiedAttributes);
1069
- tableCellFragment.import(tableCellPropertiesFragment);
1070
- if (vNodeHasChildren(vNode)) {
1071
- for (let index = 0; index < vNode.children.length; index++) {
1072
- const childVNode = vNode.children[index];
1073
- if (isVNode(childVNode) && childVNode.tagName === 'img') {
1074
- const imageFragment = await buildImage(docxDocumentInstance, childVNode, modifiedAttributes.maximumWidth);
1075
- if (imageFragment) {
1076
- tableCellFragment.import(imageFragment);
1077
- }
1078
- }
1079
- else if (isVNode(childVNode) && childVNode.tagName === 'figure') {
1080
- if (vNodeHasChildren(childVNode)) {
1081
- // eslint-disable-next-line no-plusplus
1082
- for (let iteratorIndex = 0; iteratorIndex < childVNode.children.length; iteratorIndex++) {
1083
- const grandChildVNode = childVNode.children[iteratorIndex];
1084
- if (grandChildVNode.tagName === 'img') {
1085
- const imageFragment = await buildImage(docxDocumentInstance, grandChildVNode, modifiedAttributes.maximumWidth);
1086
- if (imageFragment) {
1087
- tableCellFragment.import(imageFragment);
1088
- }
1089
- }
1090
- }
1091
- }
1092
- }
1093
- else if (isVNode(childVNode) && ['ul', 'ol'].includes(childVNode.tagName)) {
1094
- // render list in table
1095
- if (vNodeHasChildren(childVNode)) {
1096
- await buildList(childVNode, docxDocumentInstance, tableCellFragment);
1097
- }
1098
- }
1099
- else {
1100
- const paragraphFragment = await buildParagraph(childVNode, modifiedAttributes, docxDocumentInstance);
1101
- tableCellFragment.import(paragraphFragment);
1102
- }
1103
- }
1104
- }
1105
- else {
1106
- // TODO: Figure out why building with buildParagraph() isn't working
1107
- const paragraphFragment = fragment({ namespaceAlias: { w: namespaces.w } })
1108
- .ele('@w', 'p')
1109
- .up();
1110
- tableCellFragment.import(paragraphFragment);
1111
- }
1112
- tableCellFragment.up();
1113
- return tableCellFragment;
1114
- };
1115
- const buildRowSpanCell = (rowSpanMap, columnIndex, attributes) => {
1116
- const rowSpanCellFragments = [];
1117
- let spanObject = rowSpanMap.get(columnIndex.index);
1118
- while (spanObject && spanObject.rowSpan) {
1119
- const rowSpanCellFragment = fragment({ namespaceAlias: { w: namespaces.w } }).ele('@w', 'tc');
1120
- const tableCellPropertiesFragment = buildTableCellProperties({
1121
- ...attributes,
1122
- rowSpan: 'continue',
1123
- colSpan: spanObject.colSpan ? spanObject.colSpan : 0,
1124
- });
1125
- rowSpanCellFragment.import(tableCellPropertiesFragment);
1126
- const paragraphFragment = fragment({ namespaceAlias: { w: namespaces.w } })
1127
- .ele('@w', 'p')
1128
- .up();
1129
- rowSpanCellFragment.import(paragraphFragment);
1130
- rowSpanCellFragment.up();
1131
- rowSpanCellFragments.push(rowSpanCellFragment);
1132
- if (spanObject.rowSpan - 1 === 0) {
1133
- rowSpanMap.delete(columnIndex.index);
1134
- }
1135
- else {
1136
- rowSpanMap.set(columnIndex.index, {
1137
- rowSpan: spanObject.rowSpan - 1,
1138
- colSpan: spanObject.colSpan || 0,
1139
- });
1140
- }
1141
- columnIndex.index += spanObject.colSpan || 1;
1142
- spanObject = rowSpanMap.get(columnIndex.index);
1143
- }
1144
- return rowSpanCellFragments;
1145
- };
1146
- const buildTableRowProperties = (attributes) => {
1147
- const tableRowPropertiesFragment = fragment({ namespaceAlias: { w: namespaces.w } }).ele('@w', 'trPr');
1148
- if (attributes && attributes.constructor === Object) {
1149
- Object.keys(attributes).forEach((key) => {
1150
- switch (key) {
1151
- case 'tableRowHeight':
1152
- const tableRowHeightFragment = buildTableRowHeight(attributes[key]);
1153
- tableRowPropertiesFragment.import(tableRowHeightFragment);
1154
- // eslint-disable-next-line no-param-reassign
1155
- delete attributes.tableRowHeight;
1156
- break;
1157
- case 'rowCantSplit':
1158
- if (attributes.rowCantSplit) {
1159
- const cantSplitFragment = fragment({ namespaceAlias: { w: namespaces.w } })
1160
- .ele('@w', 'cantSplit')
1161
- .up();
1162
- tableRowPropertiesFragment.import(cantSplitFragment);
1163
- // eslint-disable-next-line no-param-reassign
1164
- delete attributes.rowCantSplit;
1165
- }
1166
- break;
1167
- }
1168
- });
1169
- }
1170
- tableRowPropertiesFragment.up();
1171
- return tableRowPropertiesFragment;
1172
- };
1173
- const buildTableRow = async (vNode, attributes, rowSpanMap, docxDocumentInstance) => {
1174
- const tableRowFragment = fragment({ namespaceAlias: { w: namespaces.w } }).ele('@w', 'tr');
1175
- const modifiedAttributes = { ...attributes };
1176
- if (isVNode(vNode) && vNode.properties) {
1177
- // FIXME: find a better way to get row height from cell style
1178
- if ((vNode.properties.style && vNode.properties.style.height) ||
1179
- (vNode.children[0] &&
1180
- isVNode(vNode.children[0]) &&
1181
- vNode.children[0].properties.style &&
1182
- vNode.children[0].properties.style.height)) {
1183
- modifiedAttributes.tableRowHeight = fixupRowHeight((vNode.properties.style && vNode.properties.style.height) ||
1184
- (vNode.children[0] &&
1185
- isVNode(vNode.children[0]) &&
1186
- vNode.children[0].properties.style &&
1187
- vNode.children[0].properties.style.height
1188
- ? vNode.children[0].properties.style.height
1189
- : undefined));
1190
- }
1191
- if (vNode.properties.style) {
1192
- fixupTableCellBorder(vNode, modifiedAttributes);
1193
- }
1194
- }
1195
- const tableRowPropertiesFragment = buildTableRowProperties(modifiedAttributes);
1196
- tableRowFragment.import(tableRowPropertiesFragment);
1197
- const columnIndex = { index: 0 };
1198
- if (vNodeHasChildren(vNode)) {
1199
- const tableColumns = vNode.children.filter((childVNode) => ['td', 'th'].includes(childVNode.tagName));
1200
- const maximumColumnWidth = docxDocumentInstance.availableDocumentSpace / tableColumns.length;
1201
- // eslint-disable-next-line no-restricted-syntax
1202
- for (const column of tableColumns) {
1203
- const rowSpanCellFragments = buildRowSpanCell(rowSpanMap, columnIndex, modifiedAttributes);
1204
- if (Array.isArray(rowSpanCellFragments)) {
1205
- for (let iteratorIndex = 0; iteratorIndex < rowSpanCellFragments.length; iteratorIndex++) {
1206
- const rowSpanCellFragment = rowSpanCellFragments[iteratorIndex];
1207
- tableRowFragment.import(rowSpanCellFragment);
1208
- }
1209
- }
1210
- const tableCellFragment = await buildTableCell(column, { ...modifiedAttributes, maximumWidth: maximumColumnWidth }, rowSpanMap, columnIndex, docxDocumentInstance);
1211
- columnIndex.index++;
1212
- tableRowFragment.import(tableCellFragment);
1213
- }
1214
- }
1215
- if (columnIndex.index < rowSpanMap.size) {
1216
- const rowSpanCellFragments = buildRowSpanCell(rowSpanMap, columnIndex, modifiedAttributes);
1217
- if (Array.isArray(rowSpanCellFragments)) {
1218
- for (let iteratorIndex = 0; iteratorIndex < rowSpanCellFragments.length; iteratorIndex++) {
1219
- const rowSpanCellFragment = rowSpanCellFragments[iteratorIndex];
1220
- tableRowFragment.import(rowSpanCellFragment);
1221
- }
1222
- }
1223
- }
1224
- tableRowFragment.up();
1225
- return tableRowFragment;
1226
- };
1227
- const buildTableGridCol = (gridWidth) => fragment({ namespaceAlias: { w: namespaces.w } })
1228
- .ele('@w', 'gridCol')
1229
- .att('@w', 'w', String(gridWidth));
1230
- const buildTableGrid = (vNode, attributes) => {
1231
- const tableGridFragment = fragment({ namespaceAlias: { w: namespaces.w } }).ele('@w', 'tblGrid');
1232
- if (vNodeHasChildren(vNode)) {
1233
- const gridColumns = vNode.children.filter((childVNode) => childVNode.tagName === 'col');
1234
- const gridWidth = attributes.maximumWidth / gridColumns.length;
1235
- for (let index = 0; index < gridColumns.length; index++) {
1236
- const tableGridColFragment = buildTableGridCol(gridWidth);
1237
- tableGridFragment.import(tableGridColFragment);
1238
- }
1239
- }
1240
- tableGridFragment.up();
1241
- return tableGridFragment;
1242
- };
1243
- const buildTableGridFromTableRow = (vNode, attributes) => {
1244
- const tableGridFragment = fragment({ namespaceAlias: { w: namespaces.w } }).ele('@w', 'tblGrid');
1245
- if (vNodeHasChildren(vNode)) {
1246
- const numberOfGridColumns = vNode.children.reduce((accumulator, childVNode) => {
1247
- const colSpan = childVNode.properties.colSpan ||
1248
- (childVNode.properties.style && childVNode.properties.style['column-span']);
1249
- return accumulator + (colSpan ? parseInt(colSpan) : 1);
1250
- }, 0);
1251
- const gridWidth = attributes.maximumWidth / numberOfGridColumns;
1252
- for (let index = 0; index < numberOfGridColumns; index++) {
1253
- const tableGridColFragment = buildTableGridCol(gridWidth);
1254
- tableGridFragment.import(tableGridColFragment);
1255
- }
1256
- }
1257
- tableGridFragment.up();
1258
- return tableGridFragment;
1259
- };
1260
- const buildTableBorders = (tableBorder) => {
1261
- const tableBordersFragment = fragment({ namespaceAlias: { w: namespaces.w } }).ele('@w', 'tblBorders');
1262
- const { color, stroke, ...borders } = tableBorder;
1263
- Object.keys(borders).forEach((border) => {
1264
- if (borders[border]) {
1265
- const borderFragment = buildBorder(border, borders[border], 0, color, stroke);
1266
- tableBordersFragment.import(borderFragment);
1267
- }
1268
- });
1269
- tableBordersFragment.up();
1270
- return tableBordersFragment;
1271
- };
1272
- const buildTableWidth = (tableWidth) => fragment({ namespaceAlias: { w: namespaces.w } })
1273
- .ele('@w', 'tblW')
1274
- .att('@w', 'type', 'dxa')
1275
- .att('@w', 'w', String(tableWidth))
1276
- .up();
1277
- const buildCellMargin = (side, margin) => fragment({ namespaceAlias: { w: namespaces.w } })
1278
- .ele('@w', side)
1279
- .att('@w', 'type', 'dxa')
1280
- .att('@w', 'w', String(margin))
1281
- .up();
1282
- const buildTableCellMargins = (margin) => {
1283
- const tableCellMarFragment = fragment({ namespaceAlias: { w: namespaces.w } }).ele('@w', 'tblCellMar');
1284
- ['top', 'bottom'].forEach((side) => {
1285
- const marginFragment = buildCellMargin(side, margin / 2);
1286
- tableCellMarFragment.import(marginFragment);
1287
- });
1288
- ['left', 'right'].forEach((side) => {
1289
- const marginFragment = buildCellMargin(side, margin);
1290
- tableCellMarFragment.import(marginFragment);
1291
- });
1292
- return tableCellMarFragment;
1293
- };
1294
- const buildTableProperties = (attributes) => {
1295
- const tablePropertiesFragment = fragment({ namespaceAlias: { w: namespaces.w } }).ele('@w', 'tblPr');
1296
- if (attributes && attributes.constructor === Object) {
1297
- Object.keys(attributes).forEach((key) => {
1298
- switch (key) {
1299
- case 'tableBorder':
1300
- const tableBordersFragment = buildTableBorders(attributes[key]);
1301
- tablePropertiesFragment.import(tableBordersFragment);
1302
- // eslint-disable-next-line no-param-reassign
1303
- delete attributes.tableBorder;
1304
- break;
1305
- case 'tableCellSpacing':
1306
- const tableCellSpacingFragment = buildTableCellSpacing(attributes[key]);
1307
- tablePropertiesFragment.import(tableCellSpacingFragment);
1308
- // eslint-disable-next-line no-param-reassign
1309
- delete attributes.tableCellSpacing;
1310
- break;
1311
- case 'width':
1312
- if (attributes[key]) {
1313
- const tableWidthFragment = buildTableWidth(attributes[key]);
1314
- tablePropertiesFragment.import(tableWidthFragment);
1315
- }
1316
- // eslint-disable-next-line no-param-reassign
1317
- delete attributes.width;
1318
- break;
1319
- }
1320
- });
1321
- }
1322
- const tableCellMarginFragment = buildTableCellMargins(160);
1323
- tablePropertiesFragment.import(tableCellMarginFragment);
1324
- // by default, all tables are center aligned.
1325
- const alignmentFragment = buildHorizontalAlignment('center');
1326
- tablePropertiesFragment.import(alignmentFragment);
1327
- tablePropertiesFragment.up();
1328
- return tablePropertiesFragment;
1329
- };
1330
- const cssBorderParser = (borderString) => {
1331
- let [size, stroke, color] = borderString.split(' ');
1332
- if (pointRegex.test(size)) {
1333
- const matchedParts = size.match(pointRegex);
1334
- // convert point to eighth of a point
1335
- size = pointToEIP(matchedParts[1]);
1336
- }
1337
- else if (pixelRegex.test(size)) {
1338
- const matchedParts = size.match(pixelRegex);
1339
- // convert pixels to eighth of a point
1340
- size = pixelToEIP(matchedParts[1]);
1341
- }
1342
- stroke = stroke && ['dashed', 'dotted', 'double'].includes(stroke) ? stroke : 'single';
1343
- color = color && fixupColorCode(color).toUpperCase();
1344
- return [size, stroke, color];
1345
- };
1346
- const buildTable = async (vNode, attributes, docxDocumentInstance) => {
1347
- const tableFragment = fragment({ namespaceAlias: { w: namespaces.w } }).ele('@w', 'tbl');
1348
- const modifiedAttributes = { ...attributes };
1349
- if (isVNode(vNode) && vNode.properties) {
1350
- const tableAttributes = vNode.properties.attributes || {};
1351
- const tableStyles = vNode.properties.style || {};
1352
- const tableBorders = {};
1353
- const tableCellBorders = {};
1354
- let [borderSize, borderStrike, borderColor] = [2, 'single', '000000'];
1355
- // eslint-disable-next-line no-restricted-globals
1356
- if (!isNaN(tableAttributes.border)) {
1357
- borderSize = parseInt(tableAttributes.border, 10);
1358
- }
1359
- // css style overrides table border properties
1360
- if (tableStyles.border) {
1361
- const [cssSize, cssStroke, cssColor] = cssBorderParser(tableStyles.border);
1362
- borderSize = cssSize || borderSize;
1363
- borderColor = cssColor || borderColor;
1364
- borderStrike = cssStroke || borderStrike;
1365
- }
1366
- tableBorders.top = borderSize;
1367
- tableBorders.bottom = borderSize;
1368
- tableBorders.left = borderSize;
1369
- tableBorders.right = borderSize;
1370
- tableBorders.stroke = borderStrike;
1371
- tableBorders.color = borderColor;
1372
- if (tableStyles['border-collapse'] === 'collapse') {
1373
- tableBorders.insideV = borderSize;
1374
- tableBorders.insideH = borderSize;
1375
- }
1376
- else {
1377
- tableBorders.insideV = 0;
1378
- tableBorders.insideH = 0;
1379
- tableCellBorders.top = 1;
1380
- tableCellBorders.bottom = 1;
1381
- tableCellBorders.left = 1;
1382
- tableCellBorders.right = 1;
1383
- }
1384
- modifiedAttributes.tableBorder = tableBorders;
1385
- modifiedAttributes.tableCellSpacing = 0;
1386
- if (Object.keys(tableCellBorders).length) {
1387
- modifiedAttributes.tableCellBorder = tableCellBorders;
1388
- }
1389
- let minimumWidth;
1390
- let maximumWidth;
1391
- let width;
1392
- // Calculate minimum width of table
1393
- if (pixelRegex.test(tableStyles['min-width'])) {
1394
- minimumWidth = pixelToTWIP(tableStyles['min-width'].match(pixelRegex)[1]);
1395
- }
1396
- else if (percentageRegex.test(tableStyles['min-width'])) {
1397
- const percentageValue = tableStyles['min-width'].match(percentageRegex)[1];
1398
- minimumWidth = Math.round((percentageValue / 100) * attributes.maximumWidth);
1399
- }
1400
- // Calculate maximum width of table
1401
- if (pixelRegex.test(tableStyles['max-width'])) {
1402
- pixelRegex.lastIndex = 0;
1403
- maximumWidth = pixelToTWIP(tableStyles['max-width'].match(pixelRegex)[1]);
1404
- }
1405
- else if (percentageRegex.test(tableStyles['max-width'])) {
1406
- percentageRegex.lastIndex = 0;
1407
- const percentageValue = tableStyles['max-width'].match(percentageRegex)[1];
1408
- maximumWidth = Math.round((percentageValue / 100) * attributes.maximumWidth);
1409
- }
1410
- // Calculate specified width of table
1411
- if (pixelRegex.test(tableStyles.width)) {
1412
- pixelRegex.lastIndex = 0;
1413
- width = pixelToTWIP(tableStyles.width.match(pixelRegex)[1]);
1414
- }
1415
- else if (percentageRegex.test(tableStyles.width)) {
1416
- percentageRegex.lastIndex = 0;
1417
- const percentageValue = tableStyles.width.match(percentageRegex)[1];
1418
- width = Math.round((percentageValue / 100) * attributes.maximumWidth);
1419
- }
1420
- // If width isn't supplied, we should have min-width as the width.
1421
- if (width) {
1422
- modifiedAttributes.width = width;
1423
- if (maximumWidth) {
1424
- modifiedAttributes.width = Math.min(modifiedAttributes.width, maximumWidth);
1425
- }
1426
- if (minimumWidth) {
1427
- modifiedAttributes.width = Math.max(modifiedAttributes.width, minimumWidth);
1428
- }
1429
- }
1430
- else if (minimumWidth) {
1431
- modifiedAttributes.width = minimumWidth;
1432
- }
1433
- if (modifiedAttributes.width) {
1434
- modifiedAttributes.width = Math.min(modifiedAttributes.width, attributes.maximumWidth);
1435
- }
1436
- }
1437
- const tablePropertiesFragment = buildTableProperties(modifiedAttributes);
1438
- tableFragment.import(tablePropertiesFragment);
1439
- const rowSpanMap = new Map();
1440
- if (vNodeHasChildren(vNode)) {
1441
- for (let index = 0; index < vNode.children.length; index++) {
1442
- const childVNode = vNode.children[index];
1443
- if (childVNode.tagName === 'colgroup') {
1444
- const tableGridFragment = buildTableGrid(childVNode, modifiedAttributes);
1445
- tableFragment.import(tableGridFragment);
1446
- }
1447
- else if (childVNode.tagName === 'thead') {
1448
- for (let iteratorIndex = 0; iteratorIndex < childVNode.children.length; iteratorIndex++) {
1449
- const grandChildVNode = childVNode.children[iteratorIndex];
1450
- if (grandChildVNode.tagName === 'tr') {
1451
- if (iteratorIndex === 0) {
1452
- const tableGridFragment = buildTableGridFromTableRow(grandChildVNode, modifiedAttributes);
1453
- tableFragment.import(tableGridFragment);
1454
- }
1455
- const tableRowFragment = await buildTableRow(grandChildVNode, modifiedAttributes, rowSpanMap, docxDocumentInstance);
1456
- tableFragment.import(tableRowFragment);
1457
- }
1458
- }
1459
- }
1460
- else if (childVNode.tagName === 'tbody') {
1461
- for (let iteratorIndex = 0; iteratorIndex < childVNode.children.length; iteratorIndex++) {
1462
- const grandChildVNode = childVNode.children[iteratorIndex];
1463
- if (grandChildVNode.tagName === 'tr') {
1464
- if (iteratorIndex === 0) {
1465
- const tableGridFragment = buildTableGridFromTableRow(grandChildVNode, modifiedAttributes);
1466
- tableFragment.import(tableGridFragment);
1467
- }
1468
- const tableRowFragment = await buildTableRow(grandChildVNode, modifiedAttributes, rowSpanMap, docxDocumentInstance);
1469
- tableFragment.import(tableRowFragment);
1470
- }
1471
- }
1472
- }
1473
- else if (childVNode.tagName === 'tr') {
1474
- if (index === 0) {
1475
- const tableGridFragment = buildTableGridFromTableRow(childVNode, modifiedAttributes);
1476
- tableFragment.import(tableGridFragment);
1477
- }
1478
- const tableRowFragment = await buildTableRow(childVNode, modifiedAttributes, rowSpanMap, docxDocumentInstance);
1479
- tableFragment.import(tableRowFragment);
1480
- }
1481
- }
1482
- }
1483
- tableFragment.up();
1484
- return tableFragment;
1485
- };
1486
- const buildPresetGeometry = () => fragment({ namespaceAlias: { a: namespaces.a } })
1487
- .ele('@a', 'prstGeom')
1488
- .att('prst', 'rect')
1489
- .up();
1490
- const buildExtents = ({ width, height }) => fragment({ namespaceAlias: { a: namespaces.a } })
1491
- .ele('@a', 'ext')
1492
- .att('cx', width)
1493
- .att('cy', height)
1494
- .up();
1495
- const buildOffset = () => fragment({ namespaceAlias: { a: namespaces.a } })
1496
- .ele('@a', 'off')
1497
- .att('x', '0')
1498
- .att('y', '0')
1499
- .up();
1500
- const buildGraphicFrameTransform = (attributes) => {
1501
- const graphicFrameTransformFragment = fragment({ namespaceAlias: { a: namespaces.a } }).ele('@a', 'xfrm');
1502
- const offsetFragment = buildOffset();
1503
- graphicFrameTransformFragment.import(offsetFragment);
1504
- const extentsFragment = buildExtents(attributes);
1505
- graphicFrameTransformFragment.import(extentsFragment);
1506
- graphicFrameTransformFragment.up();
1507
- return graphicFrameTransformFragment;
1508
- };
1509
- const buildShapeProperties = (attributes) => {
1510
- const shapeProperties = fragment({ namespaceAlias: { pic: namespaces.pic } }).ele('@pic', 'spPr');
1511
- const graphicFrameTransformFragment = buildGraphicFrameTransform(attributes);
1512
- shapeProperties.import(graphicFrameTransformFragment);
1513
- const presetGeometryFragment = buildPresetGeometry();
1514
- shapeProperties.import(presetGeometryFragment);
1515
- shapeProperties.up();
1516
- return shapeProperties;
1517
- };
1518
- const buildFillRect = () => fragment({ namespaceAlias: { a: namespaces.a } })
1519
- .ele('@a', 'fillRect')
1520
- .up();
1521
- const buildStretch = () => {
1522
- const stretchFragment = fragment({ namespaceAlias: { a: namespaces.a } }).ele('@a', 'stretch');
1523
- const fillRectFragment = buildFillRect();
1524
- stretchFragment.import(fillRectFragment);
1525
- stretchFragment.up();
1526
- return stretchFragment;
1527
- };
1528
- const buildSrcRectFragment = () => fragment({ namespaceAlias: { a: namespaces.a } })
1529
- .ele('@a', 'srcRect')
1530
- .att('b', '0')
1531
- .att('l', '0')
1532
- .att('r', '0')
1533
- .att('t', '0')
1534
- .up();
1535
- const buildBinaryLargeImageOrPicture = (relationshipId) => fragment({
1536
- namespaceAlias: { a: namespaces.a, r: namespaces.r },
1537
- })
1538
- .ele('@a', 'blip')
1539
- .att('@r', 'embed', `rId${relationshipId}`)
1540
- // FIXME: possible values 'email', 'none', 'print', 'hqprint', 'screen'
1541
- .att('cstate', 'print')
1542
- .up();
1543
- const buildBinaryLargeImageOrPictureFill = (relationshipId) => {
1544
- const binaryLargeImageOrPictureFillFragment = fragment({
1545
- namespaceAlias: { pic: namespaces.pic },
1546
- }).ele('@pic', 'blipFill');
1547
- const binaryLargeImageOrPictureFragment = buildBinaryLargeImageOrPicture(relationshipId);
1548
- binaryLargeImageOrPictureFillFragment.import(binaryLargeImageOrPictureFragment);
1549
- const srcRectFragment = buildSrcRectFragment();
1550
- binaryLargeImageOrPictureFillFragment.import(srcRectFragment);
1551
- const stretchFragment = buildStretch();
1552
- binaryLargeImageOrPictureFillFragment.import(stretchFragment);
1553
- binaryLargeImageOrPictureFillFragment.up();
1554
- return binaryLargeImageOrPictureFillFragment;
1555
- };
1556
- const buildNonVisualPictureDrawingProperties = () => fragment({ namespaceAlias: { pic: namespaces.pic } })
1557
- .ele('@pic', 'cNvPicPr')
1558
- .up();
1559
- const buildNonVisualDrawingProperties = (pictureId, pictureNameWithExtension, pictureDescription = '') => fragment({ namespaceAlias: { pic: namespaces.pic } })
1560
- .ele('@pic', 'cNvPr')
1561
- .att('id', pictureId)
1562
- .att('name', pictureNameWithExtension)
1563
- .att('descr', pictureDescription)
1564
- .up();
1565
- const buildNonVisualPictureProperties = (pictureId, pictureNameWithExtension, pictureDescription) => {
1566
- const nonVisualPicturePropertiesFragment = fragment({
1567
- namespaceAlias: { pic: namespaces.pic },
1568
- }).ele('@pic', 'nvPicPr');
1569
- // TODO: Handle picture attributes
1570
- const nonVisualDrawingPropertiesFragment = buildNonVisualDrawingProperties(pictureId, pictureNameWithExtension, pictureDescription);
1571
- nonVisualPicturePropertiesFragment.import(nonVisualDrawingPropertiesFragment);
1572
- const nonVisualPictureDrawingPropertiesFragment = buildNonVisualPictureDrawingProperties();
1573
- nonVisualPicturePropertiesFragment.import(nonVisualPictureDrawingPropertiesFragment);
1574
- nonVisualPicturePropertiesFragment.up();
1575
- return nonVisualPicturePropertiesFragment;
1576
- };
1577
- const buildPicture = ({ id, fileNameWithExtension, description, relationshipId, width, height, }) => {
1578
- const pictureFragment = fragment({ namespaceAlias: { pic: namespaces.pic } }).ele('@pic', 'pic');
1579
- const nonVisualPicturePropertiesFragment = buildNonVisualPictureProperties(id, fileNameWithExtension, description);
1580
- pictureFragment.import(nonVisualPicturePropertiesFragment);
1581
- const binaryLargeImageOrPictureFill = buildBinaryLargeImageOrPictureFill(relationshipId);
1582
- pictureFragment.import(binaryLargeImageOrPictureFill);
1583
- const shapeProperties = buildShapeProperties({ width, height });
1584
- pictureFragment.import(shapeProperties);
1585
- pictureFragment.up();
1586
- return pictureFragment;
1587
- };
1588
- const buildGraphicData = (graphicType, attributes) => {
1589
- const graphicDataFragment = fragment({ namespaceAlias: { a: namespaces.a } })
1590
- .ele('@a', 'graphicData')
1591
- .att('uri', 'http://schemas.openxmlformats.org/drawingml/2006/picture');
1592
- if (graphicType === 'picture') {
1593
- const pictureFragment = buildPicture(attributes);
1594
- graphicDataFragment.import(pictureFragment);
1595
- }
1596
- graphicDataFragment.up();
1597
- return graphicDataFragment;
1598
- };
1599
- const buildGraphic = (graphicType, attributes) => {
1600
- const graphicFragment = fragment({ namespaceAlias: { a: namespaces.a } }).ele('@a', 'graphic');
1601
- // TODO: Handle drawing type
1602
- const graphicDataFragment = buildGraphicData(graphicType, attributes);
1603
- graphicFragment.import(graphicDataFragment);
1604
- graphicFragment.up();
1605
- return graphicFragment;
1606
- };
1607
- const buildDrawingObjectNonVisualProperties = (pictureId, pictureName) => fragment({ namespaceAlias: { wp: namespaces.wp } })
1608
- .ele('@wp', 'docPr')
1609
- .att('id', pictureId)
1610
- .att('name', pictureName)
1611
- .up();
1612
- const buildWrapSquare = () => fragment({ namespaceAlias: { wp: namespaces.wp } })
1613
- .ele('@wp', 'wrapSquare')
1614
- .att('wrapText', 'bothSides')
1615
- .att('distB', '228600')
1616
- .att('distT', '228600')
1617
- .att('distL', '228600')
1618
- .att('distR', '228600')
1619
- .up();
1620
- // eslint-disable-next-line no-unused-vars
1621
- const buildWrapNone = () => fragment({ namespaceAlias: { wp: namespaces.wp } })
1622
- .ele('@wp', 'wrapNone')
1623
- .up();
1624
- const buildEffectExtentFragment = () => fragment({ namespaceAlias: { wp: namespaces.wp } })
1625
- .ele('@wp', 'effectExtent')
1626
- .att('b', '0')
1627
- .att('l', '0')
1628
- .att('r', '0')
1629
- .att('t', '0')
1630
- .up();
1631
- const buildExtent = ({ width, height }) => fragment({ namespaceAlias: { wp: namespaces.wp } })
1632
- .ele('@wp', 'extent')
1633
- .att('cx', width)
1634
- .att('cy', height)
1635
- .up();
1636
- const buildPositionV = () => fragment({ namespaceAlias: { wp: namespaces.wp } })
1637
- .ele('@wp', 'positionV')
1638
- .att('relativeFrom', 'paragraph')
1639
- .ele('@wp', 'posOffset')
1640
- .txt('19050')
1641
- .up()
1642
- .up();
1643
- const buildPositionH = () => fragment({ namespaceAlias: { wp: namespaces.wp } })
1644
- .ele('@wp', 'positionH')
1645
- .att('relativeFrom', 'column')
1646
- .ele('@wp', 'posOffset')
1647
- .txt('19050')
1648
- .up()
1649
- .up();
1650
- const buildSimplePos = () => fragment({ namespaceAlias: { wp: namespaces.wp } })
1651
- .ele('@wp', 'simplePos')
1652
- .att('x', '0')
1653
- .att('y', '0')
1654
- .up();
1655
- const buildAnchoredDrawing = (graphicType, attributes) => {
1656
- const anchoredDrawingFragment = fragment({ namespaceAlias: { wp: namespaces.wp } })
1657
- .ele('@wp', 'anchor')
1658
- .att('distB', '0')
1659
- .att('distL', '0')
1660
- .att('distR', '0')
1661
- .att('distT', '0')
1662
- .att('relativeHeight', '0')
1663
- .att('behindDoc', 'false')
1664
- .att('locked', 'true')
1665
- .att('layoutInCell', 'true')
1666
- .att('allowOverlap', 'false')
1667
- .att('simplePos', 'false');
1668
- // Even though simplePos isnt supported by Word 2007 simplePos is required.
1669
- const simplePosFragment = buildSimplePos();
1670
- anchoredDrawingFragment.import(simplePosFragment);
1671
- const positionHFragment = buildPositionH();
1672
- anchoredDrawingFragment.import(positionHFragment);
1673
- const positionVFragment = buildPositionV();
1674
- anchoredDrawingFragment.import(positionVFragment);
1675
- const extentFragment = buildExtent({ width: attributes.width, height: attributes.height });
1676
- anchoredDrawingFragment.import(extentFragment);
1677
- const effectExtentFragment = buildEffectExtentFragment();
1678
- anchoredDrawingFragment.import(effectExtentFragment);
1679
- const wrapSquareFragment = buildWrapSquare();
1680
- anchoredDrawingFragment.import(wrapSquareFragment);
1681
- const drawingObjectNonVisualPropertiesFragment = buildDrawingObjectNonVisualProperties(attributes.id, attributes.fileNameWithExtension);
1682
- anchoredDrawingFragment.import(drawingObjectNonVisualPropertiesFragment);
1683
- const graphicFragment = buildGraphic(graphicType, attributes);
1684
- anchoredDrawingFragment.import(graphicFragment);
1685
- anchoredDrawingFragment.up();
1686
- return anchoredDrawingFragment;
1687
- };
1688
- const buildInlineDrawing = (graphicType, attributes) => {
1689
- const inlineDrawingFragment = fragment({ namespaceAlias: { wp: namespaces.wp } })
1690
- .ele('@wp', 'inline')
1691
- .att('distB', '0')
1692
- .att('distL', '0')
1693
- .att('distR', '0')
1694
- .att('distT', '0');
1695
- const extentFragment = buildExtent({ width: attributes.width, height: attributes.height });
1696
- inlineDrawingFragment.import(extentFragment);
1697
- const effectExtentFragment = buildEffectExtentFragment();
1698
- inlineDrawingFragment.import(effectExtentFragment);
1699
- const drawingObjectNonVisualPropertiesFragment = buildDrawingObjectNonVisualProperties(attributes.id, attributes.fileNameWithExtension);
1700
- inlineDrawingFragment.import(drawingObjectNonVisualPropertiesFragment);
1701
- const graphicFragment = buildGraphic(graphicType, attributes);
1702
- inlineDrawingFragment.import(graphicFragment);
1703
- inlineDrawingFragment.up();
1704
- return inlineDrawingFragment;
1705
- };
1706
- const buildDrawing = (inlineOrAnchored = false, graphicType, attributes) => {
1707
- const drawingFragment = fragment({ namespaceAlias: { w: namespaces.w } }).ele('@w', 'drawing');
1708
- const inlineOrAnchoredDrawingFragment = inlineOrAnchored
1709
- ? buildInlineDrawing(graphicType, attributes)
1710
- : buildAnchoredDrawing(graphicType, attributes);
1711
- drawingFragment.import(inlineOrAnchoredDrawingFragment);
1712
- drawingFragment.up();
1713
- return drawingFragment;
1714
- };
1715
- // eslint-disable-next-line consistent-return, no-shadow
1716
- const buildImage = async (docxDocumentInstance, vNode, maximumWidth = null) => {
1717
- let response = null;
1718
- let base64Uri = null;
1719
- try {
1720
- const imageSource = vNode.properties.src;
1721
- if (isValidUrl(imageSource)) {
1722
- const base64String = await imageToBase64(imageSource).catch((error) => {
1723
- // eslint-disable-next-line no-console
1724
- console.warning(`skipping image download and conversion due to ${error}`);
1725
- });
1726
- if (base64String) {
1727
- base64Uri = `data:${mimeTypes.lookup(imageSource)};base64, ${base64String}`;
1728
- }
1729
- }
1730
- else {
1731
- base64Uri = decodeURIComponent(vNode.properties.src);
1732
- }
1733
- if (base64Uri) {
1734
- response = docxDocumentInstance.createMediaFile(base64Uri);
1735
- }
1736
- }
1737
- catch (error) {
1738
- // NOOP
1739
- }
1740
- if (response) {
1741
- docxDocumentInstance.zip
1742
- .folder('word')
1743
- .folder('media')
1744
- .file(response.fileNameWithExtension, Buffer.from(response.fileContent, 'base64'), {
1745
- createFolders: false,
1746
- });
1747
- const documentRelsId = docxDocumentInstance.createDocumentRelationships(docxDocumentInstance.relationshipFilename, imageType, `media/${response.fileNameWithExtension}`, internalRelationship);
1748
- const imageBuffer = Buffer.from(response.fileContent, 'base64');
1749
- const imageProperties = sizeOf(imageBuffer);
1750
- const imageFragment = await xmlBuilder.buildParagraph(vNode, {
1751
- type: 'picture',
1752
- inlineOrAnchored: true,
1753
- relationshipId: documentRelsId,
1754
- ...response,
1755
- maximumWidth: maximumWidth || docxDocumentInstance.availableDocumentSpace,
1756
- originalWidth: imageProperties.width,
1757
- originalHeight: imageProperties.height,
1758
- }, docxDocumentInstance);
1759
- return imageFragment;
1760
- }
1761
- };
1762
- const buildList = async (vNode, docxDocumentInstance, xmlFragment) => {
1763
- const listElements = [];
1764
- let vNodeObjects = [
1765
- {
1766
- node: vNode,
1767
- level: 0,
1768
- type: vNode.tagName,
1769
- numberingId: docxDocumentInstance.createNumbering(vNode.tagName, vNode.properties),
1770
- },
1771
- ];
1772
- while (vNodeObjects.length) {
1773
- const tempVNodeObject = vNodeObjects.shift();
1774
- if (isVText(tempVNodeObject.node) ||
1775
- (isVNode(tempVNodeObject.node) && !['ul', 'ol', 'li'].includes(tempVNodeObject.node.tagName))) {
1776
- const paragraphFragment = await xmlBuilder.buildParagraph(tempVNodeObject.node, {
1777
- numbering: { levelId: tempVNodeObject.level, numberingId: tempVNodeObject.numberingId },
1778
- }, docxDocumentInstance);
1779
- xmlFragment.import(paragraphFragment);
1780
- }
1781
- if (tempVNodeObject.node.children &&
1782
- tempVNodeObject.node.children.length &&
1783
- ['ul', 'ol', 'li'].includes(tempVNodeObject.node.tagName)) {
1784
- const tempVNodeObjects = tempVNodeObject.node.children.reduce((accumulator, childVNode) => {
1785
- if (['ul', 'ol'].includes(childVNode.tagName)) {
1786
- accumulator.push({
1787
- node: childVNode,
1788
- level: tempVNodeObject.level + 1,
1789
- type: childVNode.tagName,
1790
- numberingId: docxDocumentInstance.createNumbering(childVNode.tagName, childVNode.properties),
1791
- });
1792
- }
1793
- else {
1794
- // eslint-disable-next-line no-lonely-if
1795
- if (accumulator.length > 0 &&
1796
- isVNode(accumulator[accumulator.length - 1].node) &&
1797
- accumulator[accumulator.length - 1].node.tagName.toLowerCase() === 'p') {
1798
- accumulator[accumulator.length - 1].node.children.push(childVNode);
1799
- }
1800
- else {
1801
- const paragraphVNode = new VNode('p', null,
1802
- // eslint-disable-next-line no-nested-ternary
1803
- isVText(childVNode)
1804
- ? [childVNode]
1805
- : // eslint-disable-next-line no-nested-ternary
1806
- isVNode(childVNode)
1807
- ? childVNode.tagName.toLowerCase() === 'li'
1808
- ? [...childVNode.children]
1809
- : [childVNode]
1810
- : []);
1811
- accumulator.push({
1812
- // eslint-disable-next-line prettier/prettier, no-nested-ternary
1813
- node: isVNode(childVNode)
1814
- ? // eslint-disable-next-line prettier/prettier, no-nested-ternary
1815
- childVNode.tagName.toLowerCase() === 'li'
1816
- ? childVNode
1817
- : childVNode.tagName.toLowerCase() !== 'p'
1818
- ? paragraphVNode
1819
- : childVNode
1820
- : // eslint-disable-next-line prettier/prettier
1821
- paragraphVNode,
1822
- level: tempVNodeObject.level,
1823
- type: tempVNodeObject.type,
1824
- numberingId: tempVNodeObject.numberingId,
1825
- });
1826
- }
1827
- }
1828
- return accumulator;
1829
- }, []);
1830
- vNodeObjects = tempVNodeObjects.concat(vNodeObjects);
1831
- }
1832
- }
1833
- return listElements;
1834
- };
1835
- export { buildParagraph, buildTable, buildNumberingInstances, buildLineBreak, buildIndentation, buildTextElement, buildBold, buildItalics, buildUnderline, buildDrawing, fixupLineHeight, buildImage, buildList };
1836
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieG1sLWJ1aWxkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9iYnNmLXV0aWxpdGllcy9zcmMvbGliL3NoYXJlZC9jb25maWcvd29yZC9oZWxwZXJzL3htbC1idWlsZGVyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHFDQUFxQztBQUNyQywwQkFBMEI7QUFDMUIsc0NBQXNDO0FBQ3RDLHlDQUF5QztBQUN6QyxnQ0FBZ0M7QUFDaEMsbUNBQW1DO0FBQ25DLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDdkMsT0FBTyxPQUFPLE1BQU0sNEJBQTRCLENBQUM7QUFDakQsT0FBTyxPQUFPLE1BQU0sNEJBQTRCLENBQUM7QUFDakQsT0FBTyxVQUFVLE1BQU0sWUFBWSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDbkMsT0FBTyxhQUFhLE1BQU0saUJBQWlCLENBQUM7QUFDNUMsT0FBTyxTQUFTLE1BQU0sWUFBWSxDQUFDO0FBQ25DLE9BQU8sTUFBTSxNQUFNLFlBQVksQ0FBQztBQUVoQyxPQUFPLFVBQVUsTUFBTSxlQUFlLENBQUM7QUFDdkMsT0FBTyxFQUNMLFFBQVEsRUFDUixRQUFRLEVBQ1IsUUFBUSxFQUNSLFFBQVEsRUFDUixRQUFRLEVBQ1IsU0FBUyxFQUNULFNBQVMsR0FDVixNQUFNLDJCQUEyQixDQUFDO0FBQ25DLE9BQU8sRUFDTCxVQUFVLEVBQ1YsVUFBVSxFQUNWLFNBQVMsRUFDVCxlQUFlLEVBQ2YsVUFBVSxFQUNWLFVBQVUsRUFDVixTQUFTLEVBQ1QsV0FBVyxFQUNYLFVBQVUsRUFDVixXQUFXLEVBQ1gsVUFBVSxFQUNWLFVBQVUsRUFDVixRQUFRLEVBQ1IsT0FBTyxFQUNQLFNBQVMsRUFDVCxVQUFVLEdBQ1gsTUFBTSwwQkFBMEIsQ0FBQztBQUNsQyxzQ0FBc0M7QUFDdEMsMkNBQTJDO0FBQzNDLE9B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QyxDQUFDLFVBQVUsQ0FBQztvQ0FDaEIsQ0FBQyxDQUFDLEVBQUUsQ0FDVCxDQUFDO3dCQUNGLFdBQVcsQ0FBQyxJQUFJLENBQUM7NEJBQ2YsZ0VBQWdFOzRCQUNoRSxJQUFJLEVBQUUsT0FBTyxDQUFDLFVBQVUsQ0FBQztnQ0FDdkIsQ0FBQyxDQUFDLGdFQUFnRTtvQ0FDbEUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsS0FBSyxJQUFJO3dDQUN2QyxDQUFDLENBQUMsVUFBVTt3Q0FDWixDQUFDLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsS0FBSyxHQUFHOzRDQUN4QyxDQUFDLENBQUMsY0FBYzs0Q0FDaEIsQ0FBQyxDQUFDLFVBQVU7Z0NBQ2hCLENBQUMsQ0FBQyw2Q0FBNkM7b0NBQy9DLGNBQWM7NEJBQ2hCLEtBQUssRUFBRSxlQUFlLENBQUMsS0FBSzs0QkFDNUIsSUFBSSxFQUFFLGVBQWUsQ0FBQyxJQUFJOzRCQUMxQixXQUFXLEVBQUUsZUFBZSxDQUFDLFdBQVc7eUJBQ3pDLENBQUMsQ0FBQztxQkFDSjtpQkFDRjtnQkFFRCxPQUFPLFdBQVcsQ0FBQztZQUNyQixDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDUCxZQUFZLEdBQUcsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO1NBQ3REO0tBQ0Y7SUFFRCxPQUFPLFlBQVksQ0FBQztBQUN0QixDQUFDLENBQUM7QUFFRixPQUFPLEVBQ0wsY0FBYyxFQUNkLFVBQVUsRUFDVix1QkFBdUIsRUFDdkIsY0FBYyxFQUNkLGdCQUFnQixFQUNoQixnQkFBZ0IsRUFDaEIsU0FBUyxFQUNULFlBQVksRUFDWixjQUFjLEVBQ2QsWUFBWSxFQUNaLGVBQWUsRUFDZixVQUFVLEVBQ1YsU0FBUyxFQUNWLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBuby1hd2FpdC1pbi1sb29wICovXHJcbi8qIGVzbGludC1kaXNhYmxlIHJhZGl4ICovXHJcbi8qIGVzbGludC1kaXNhYmxlIG5vLXBhcmFtLXJlYXNzaWduICovXHJcbi8qIGVzbGludC1kaXNhYmxlIG5vLWNhc2UtZGVjbGFyYXRpb25zICovXHJcbi8qIGVzbGludC1kaXNhYmxlIG5vLXBsdXNwbHVzICovXHJcbi8qIGVzbGludC1kaXNhYmxlIG5vLWVsc2UtcmV0dXJuICovXHJcbmltcG9ydCB7IGZyYWdtZW50IH0gZnJvbSAneG1sYnVpbGRlcjInO1xyXG5pbXBvcnQgaXNWTm9kZSBmcm9tICd2aXJ0dWFsLWRvbS92bm9kZS9pcy12bm9kZSc7XHJcbmltcG9ydCBpc1ZUZXh0IGZyb20gJ3ZpcnR1YWwtZG9tL3Zub2RlL2lzLXZ0ZXh0JztcclxuaW1wb3J0IGNvbG9yTmFtZXMgZnJvbSAnY29sb3ItbmFtZSc7XHJcbmltcG9ydCB7IGNsb25lRGVlcCB9IGZyb20gJ2xvZGFzaCc7XHJcbmltcG9ydCBpbWFnZVRvQmFzZTY0IGZyb20gJ2ltYWdlLXRvLWJhc2U2NCc7XHJcbmltcG9ydCBtaW1lVHlwZXMgZnJvbSAnbWltZS10eXBlcyc7XHJcbmltcG9ydCBzaXplT2YgZnJvbSAnaW1hZ2Utc2l6ZSc7XHJcblxyXG5pbXBvcnQgbmFtZXNwYWNlcyBmcm9tICcuLi9uYW1lc3BhY2VzJztcclxuaW1wb3J0IHtcclxuICByZ2JUb0hleCxcclxuICBoc2xUb0hleCxcclxuICBoc2xSZWdleCxcclxuICByZ2JSZWdleCxcclxuICBoZXhSZWdleCxcclxuICBoZXgzUmVnZXgsXHJcbiAgaGV4M1RvSGV4LFxyXG59IGZyb20gJy4uL3V0aWxzL2NvbG9yLWNvbnZlcnNpb24nO1xyXG5pbXBvcnQge1xyXG4gIHBpeGVsVG9FTVUsXHJcbiAgcGl4ZWxSZWdleCxcclxuICBUV0lQVG9FTVUsXHJcbiAgcGVyY2VudGFnZVJlZ2V4LFxyXG4gIHBvaW50UmVnZXgsXHJcbiAgcG9pbnRUb0hJUCxcclxuICBISVBUb1RXSVAsXHJcbiAgcG9pbnRUb1RXSVAsXHJcbiAgcGl4ZWxUb0hJUCxcclxuICBwaXhlbFRvVFdJUCxcclxuICBwaXhlbFRvRUlQLFxyXG4gIHBvaW50VG9FSVAsXHJcbiAgY21Ub1RXSVAsXHJcbiAgY21SZWdleCxcclxuICBpbmNoUmVnZXgsXHJcbiAgaW5jaFRvVFdJUCxcclxufSBmcm9tICcuLi91dGlscy91bml0LWNvbnZlcnNpb24nO1xyXG4vLyBGSVhNRTogcmVtb3ZlIHRoZSBjeWNsaWMgZGVwZW5kZW5jeVxyXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLWN5Y2xlXHJcbmltcG9ydCB7XHJcbiAgZGVmYXVsdEZvbnQsXHJcbiAgaHlwZXJsaW5rVHlwZSxcclxuICBwYXJhZ3JhcGhCb3JkZXJzT2JqZWN0LFxyXG4gIGNvbG9ybGVzc0NvbG9ycyxcclxuICB2ZXJ0aWNhbEFsaWduVmFsdWVzLFxyXG4gIGltYWdlVHlwZSxcclxuICBpbnRlcm5hbFJlbGF0aW9uc2hpcCxcclxufSBmcm9tICcuLi9jb25zdGFudHMnO1xyXG5pbXBvcnQgeyB2Tm9kZUhhc0NoaWxkcmVuIH0gZnJvbSAnLi4vdXRpbHMvdm5vZGUnO1xyXG5pbXBvcnQgeyBpc1ZhbGlkVXJsIH0gZnJvbSAnLi4vdXRpbHMvdXJsJztcclxuXHJcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb25zaXN0ZW50LXJldHVyblxyXG5jb25zdCBmaXh1cENvbG9yQ29kZSA9IChjb2xvckNvZGVTdHJpbmcpID0+IHtcclxuICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbG9yTmFtZXMsIGNvbG9yQ29kZVN0cmluZy50b0xvd2VyQ2FzZSgpKSkge1xyXG4gICAgY29uc3QgW3JlZCwgZ3JlZW4sIGJsdWVdID0gY29sb3JOYW1lc1tjb2xvckNvZGVTdHJpbmcudG9Mb3dlckNhc2UoKV07XHJcblxyXG4gICAgcmV0dXJuIHJnYlRvSGV4KHJlZCwgZ3JlZW4sIGJsdWUpO1xyXG4gIH0gZWxzZSBpZiAocmdiUmVnZXgudGVzdChjb2xvckNvZGVTdHJpbmcpKSB7XHJcbiAgICBjb25zdCBtYXRjaGVkUGFydHMgPSBjb2xvckNvZGVTdHJpbmcubWF0Y2gocmdiUmVnZXgpO1xyXG4gICAgY29uc3QgcmVkID0gbWF0Y2hlZFBhcnRzWzFdO1xyXG4gICAgY29uc3QgZ3JlZW4gPSBtYXRjaGVkUGFydHNbMl07XHJcbiAgICBjb25zdCBibHVlID0gbWF0Y2hlZFBhcnRzWzNdO1xyXG5cclxuICAgIHJldHVybiByZ2JUb0hleChyZWQsIGdyZWVuLCBibHVlKTtcclxuICB9IGVsc2UgaWYgKGhzbFJlZ2V4LnRlc3QoY29sb3JDb2RlU3RyaW5nKSkge1xyXG4gICAgY29uc3QgbWF0Y2hlZFBhcnRzID0gY29sb3JDb2RlU3RyaW5nLm1hdGNoKGhzbFJlZ2V4KTtcclxuICAgIGNvbnN0IGh1ZSA9IG1hdGNoZWRQYXJ0c1sxXTtcclxuICAgIGNvbnN0IHNhdHVyYXRpb24gPSBtYXRjaGVkUGFydHNbMl07XHJcbiAgICBjb25zdCBsdW1pbm9zaXR5ID0gbWF0Y2hlZFBhcnRzWzNdO1xyXG5cclxuICAgIHJldHVybiBoc2xUb0hleChodWUsIHNhdHVyYXRpb24sIGx1bWlub3NpdHkpO1xyXG4gIH0gZWxzZSBpZiAoaGV4UmVnZXgudGVzdChjb2xvckNvZGVTdHJpbmcpKSB7XHJcbiAgICBjb25zdCBtYXRjaGVkUGFydHMgPSBjb2xvckNvZGVTdHJpbmcubWF0Y2goaGV4UmVnZXgpO1xyXG5cclxuICAgIHJldHVybiBtYXRjaGVkUGFydHNbMV07XHJcbiAgfSBlbHNlIGlmIChoZXgzUmVnZXgudGVzdChjb2xvckNvZGVTdHJpbmcpKSB7XHJcbiAgICBjb25zdCBtYXRjaGVkUGFydHMgPSBjb2xvckNvZGVTdHJpbmcubWF0Y2goaGV4M1JlZ2V4KTtcclxuICAgIGNvbnN0IHJlZCA9IG1hdGNoZWRQYXJ0c1sxXTtcclxuICAgIGNvbnN0IGdyZWVuID0gbWF0Y2hlZFBhcnRzWzJdO1xyXG4gICAgY29uc3QgYmx1ZSA9IG1hdGNoZWRQYXJ0c1szXTtcclxuXHJcbiAgICByZXR1cm4gaGV4M1RvSGV4KHJlZCwgZ3JlZW4sIGJsdWUpO1xyXG4gIH0gZWxzZSB7XHJcbiAgICByZXR1cm4gJzAwMDAwMCc7XHJcbiAgfVxyXG59O1xyXG5cclxuY29uc3QgYnVpbGRSdW5Gb250RnJhZ21lbnQgPSAoZm9udE5hbWUgPSBkZWZhdWx0Rm9udCkgPT5cclxuICBmcmFnbWVudCh7IG5hbWVzcGFjZUFsaWFzOiB7IHc6IG5hbWVzcGFjZXMudyB9IH0pXHJcbiAgICAuZWxlKCdAdycsICdyRm9udHMnKVxyXG4gICAgLmF0dCgnQHcnLCAnYXNjaWknLCBmb250TmFtZSlcclxuICAgIC5hdHQoJ0B3JywgJ2hBbnNpJywgZm9udE5hbWUpXHJcbiAgICAudXAoKTtcclxuXHJcbmNvbnN0IGJ1aWxkUnVuU3R5bGVGcmFnbWVudCA9ICh0eXBlID0gJ0h5cGVybGluaycpID0+XHJcbiAgZnJhZ21lbnQoeyBuYW1lc3BhY2VBbGlhczogeyB3OiBuYW1lc3BhY2VzLncgfSB9KVxyXG4gICAgLmVsZSgnQHcnLCAnclN0eWxlJylcclxuICAgIC5hdHQoJ0B3JywgJ3ZhbCcsIHR5cGUpXHJcbiAgICAudXAoKTtcclxuXHJcbmNvbnN0IGJ1aWxkVGFibGVSb3dIZWlnaHQgPSAodGFibGVSb3dIZWlnaHQpID0+XHJcbiAgZnJhZ21lbnQoeyBuYW1lc3BhY2VBbGlhczogeyB3OiBuYW1lc3BhY2VzLncgfSB9KVxyXG4gICAgLmVsZSgnQHcnLCAndHJIZWlnaHQnKVxyXG4gICAgLmF0dCgnQHcnLCAndmFsJywgdGFibGVSb3dIZWlnaHQpXHJcbiAgICAuYXR0KCdAdycsICdoUnVsZScsICdhdExlYXN0JylcclxuICAgIC51cCgpO1xyXG5cclxuY29uc3QgYnVpbGRWZXJ0aWNhbEFsaWdubWVudCA9ICh2ZXJ0aWNhbEFsaWdubWVudCkgPT4ge1xyXG4gIGlmICh2ZXJ0aWNhbEFsaWdubWVudC50b0xvd2VyQ2FzZSgpID09PSAnbWlkZGxlJykge1xyXG4gICAgdmVydGljYWxBbGlnbm1lbnQgPSAnY2VudGVyJztcclxuICB9XHJcblxyXG4gIHJldHVybiBmcmFnbWVudCh7IG5hbWVzcGFjZUFsaWFzOiB7IHc6IG5hbWVzcGFjZXMudyB9IH0pXHJcbiAgICAuZWxlKCdAdycsICd2QWxpZ24nKVxyXG4gICAgLmF0dCgnQHcnLCAndmFsJywgdmVydGljYWxBbGlnbm1lbnQpXHJcbiAgICAudXAoKTtcclxufTtcclxuXHJcbmNvbnN0IGJ1aWxkVmVydGljYWxNZXJnZSA9ICh2ZXJ0aWNhbE1lcmdlID0gJ2NvbnRpbnVlJykgPT5cclxuICBmcmFnbWVudCh7IG5hbWVzcGFjZUFsaWFzOiB7IHc6IG5hbWVzcGFjZXMudyB9IH0pXHJcbiAgICAuZWxlKCdAdycsICd2TWVyZ2UnKVxyXG4gICAgLmF0dCgnQHcnLCAndmFsJywgdmVydGljYWxNZXJnZSlcclxuICAgIC51cCgpO1xyXG5cclxuY29uc3QgYnVpbGRDb2xvciA9IChjb2xvckNvZGUpID0+XHJcbiAgZnJhZ21lbnQoeyBuYW1lc3BhY2VBbGlhczogeyB3OiBuYW1lc3BhY2VzLncgfSB9KVxyXG4gICAgLmVsZSgnQHcnLCAnY29sb3InKVxyXG4gICAgLmF0dCgnQHcnLCAndmFsJywgY29sb3JDb2RlKVxyXG4gICAgLnVwKCk7XHJcblxyXG5jb25zdCBidWlsZEZvbnRTaXplID0gKGZvbnRTaXplKSA9PlxyXG4gIGZyYWdtZW50KHsgbmFtZXNwYWNlQWxpYXM6IHsgdzogbmFtZXNwYWNlcy53IH0gfSlcclxuICAgIC5lbGUoJ0B3JywgJ3N6JylcclxuICAgIC5hdHQoJ0B3JywgJ3ZhbCcsIGZvbnRTaXplKVxyXG4gICAgLnVwKCk7XHJcblxyXG5jb25zdCBidWlsZFNoYWRpbmcgPSAoY29sb3JDb2RlKSA9PlxyXG4gIGZyYWdtZW50KHsgbmFtZXNwYWNlQWxpYXM6IHsgdzogbmFtZXNwYWNlcy53IH0gfSlcclxuICAgIC5lbGUoJ0B3JywgJ3NoZCcpXHJcbiAgICAuYXR0KCdAdycsICd2YWwnLCAnY2xlYXInKVxyXG4gICAgLmF0dCgnQHcnLCAnZmlsbCcsIGNvbG9yQ29kZSlcclxuICAgIC51cCgpO1xyXG5cclxuY29uc3QgYnVpbGRIaWdobGlnaHQgPSAoY29sb3IgPSAneWVsbG93JykgPT5cclxuICBmcmFnbWVudCh7IG5hbWVzcGFjZUFsaWFzOiB7IHc6IG5hbWVzcGFjZXMudyB9IH0pXHJcbiAgICAuZWxlKCdAdycsICdoaWdobGlnaHQnKVxyXG4gICAgLmF0dCgnQHcnLCAndmFsJywgY29sb3IpXHJcbiAgICAudXAoKTtcclxuXHJcbmNvbnN0IGJ1aWxkVmVydEFsaWduID0gKHR5cGUgPSAnYmFzZWxpbmUnKSA9PlxyXG4gIGZyYWdtZW50KHsgbmFtZXNwYWNlQWxpYXM6IHsgdzogbmFtZXNwYWNlcy53IH0gfSlcclxuICAgIC5lbGUoJ0B3JywgJ3ZlcnRBbGlnbicpXHJcbiAgICAuYXR0KCdAdycsICd2YWwnLCB0eXBlKVxyXG4gICAgLnVwKCk7XHJcblxyXG5jb25zdCBidWlsZFN0cmlrZSA9ICgpID0+XHJcbiAgZnJhZ21lbnQoeyBuYW1lc3BhY2VBbGlhczogeyB3OiBuYW1lc3BhY2VzLncgfSB9KVxyXG4gICAgLmVsZSgnQHcnLCAnc3RyaWtlJylcclxuICAgIC5hdHQoJ0B3JywgJ3ZhbCcsIHRydWUpXHJcbiAgICAudXAoKTtcclxuXHJcbmNvbnN0IGJ1aWxkQm9sZCA9ICgpID0+XHJcbiAgZnJhZ21lbnQoeyBuYW1lc3BhY2VBbGlhczogeyB3OiBuYW1lc3BhY2VzLncgfSB9KVxyXG4gICAgLmVsZSgnQHcnLCAnYicpXHJcbiAgICAudXAoKTtcclxuXHJcbmNvbnN0IGJ1aWxkSXRhbGljcyA9ICgpID0+XHJcbiAgZnJhZ21lbnQoeyBuYW1lc3BhY2VBbGlhczogeyB3OiBuYW1lc3BhY2VzLncgfSB9KVxyXG4gICAgLmVsZSgnQHcnLCAnaScpXHJcbiAgICAudXAoKTtcclxuXHJcbmNvbnN0IGJ1aWxkVW5kZXJsaW5lID0gKHR5cGUgPSAnc2luZ2xlJykgPT5cclxuICBmcmFnbWVudCh7IG5hbWVzcGFjZUFsaWFzOiB7IHc6IG5hbWVzcGFjZXMudyB9IH0pXHJcbiAgICAuZWxlKCdAdycsICd1JylcclxuICAgIC5hdHQoJ0B3JywgJ3ZhbCcsIHR5cGUpXHJcbiAgICAudXAoKTtcclxuXHJcbmNvbnN0IGJ1aWxkTGluZUJyZWFrID0gKHR5cGUgPSAndGV4dFdyYXBwaW5nJykgPT5cclxuICBmcmFnbWVudCh7IG5hbWVzcGFjZUFsaWFzOiB7IHc6IG5hbWVzcGFjZXMudyB9IH0pXHJcbiAgICAuZWxlKCdAdycsICdicicpXHJcbiAgICAuYXR0KCdAdycsICd0eXBlJywgdHlwZSlcclxuICAgIC51cCgpO1xyXG5cclxuY29uc3QgYnVpbGRCb3JkZXIgPSAoXHJcbiAgYm9yZGVyU2lkZSA9ICd0b3AnLFxyXG4gIGJvcmRlclNpemUgPSAwLFxyXG4gIGJvcmRlclNwYWNpbmcgPSAwLFxyXG4gIGJvcmRlckNvbG9yID0gZml4dXBDb2xvckNvZGUoJ2JsYWNrJyksXHJcbiAgYm9yZGVyU3Ryb2tlID0gJ3NpbmdsZSdcclxuKSA9PlxyXG4gIGZyYWdtZW50KHsgbmFtZXNwYWNlQWxpYXM6IHsgdzogbmFtZXNwYWNlcy53IH0gfSlcclxuICAgIC5lbGUoJ0B3JywgYm9yZGVyU2lkZSlcclxuICAgIC5hdHQoJ0B3JywgJ3ZhbCcsIGJvcmRlclN0cm9rZSlcclxuICAgIC5hdHQoJ0B3JywgJ3N6JywgYm9yZGVyU2l6ZSlcclxuICAgIC5hdHQoJ0B3JywgJ3NwYWNlJywgYm9yZGVyU3BhY2luZylcclxuICAgIC5hdHQoJ0B3JywgJ2NvbG9yJywgYm9yZGVyQ29sb3IpXHJcbiAgICAudXAoKTtcclxuXHJcbmNvbnN0IGJ1aWxkVGV4dEVsZW1lbnQgPSAodGV4dCkgPT5cclxuICBmcmFnbWVudCh7IG5hbWVzcGFjZUFsaWFzOiB7IHc6IG5hbWVzcGFjZXMudyB9IH0pXHJcbiAgICAuZWxlKCdAdycsICd0JylcclxuICAgIC5hdHQoJ0B4bWwnLCAnc3BhY2UnLCAncHJlc2VydmUnKVxyXG4gICAgLnR4dCh0ZXh0KVxyXG4gICAgLnVwKCk7XHJcblxyXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29uc2lzdGVudC1yZXR1cm5cclxuY29uc3QgZml4dXBMaW5lSGVpZ2h0ID0gKGxpbmVIZWlnaHQsIGZvbnRTaXplKSA9PiB7XHJcbiAgLy8gRklYTUU6IElmIGxpbmUgaGVpZ2h0IGlzIGFueXRoaW5nIG90aGVyIHRoYW4gYSBudW1iZXJcclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1nbG9iYWxzXHJcbiAgaWYgKCFpc05hTihsaW5lSGVpZ2h0KSkge1xyXG4gICAgaWYgKGZvbnRTaXplKSB7XHJcbiAgICAgIGNvbnN0IGFjdHVhbExpbmVIZWlnaHQgPSArbGluZUhlaWdodCAqIGZvbnRTaXplO1xyXG5cclxuICAgICAgcmV0dXJuIEhJUFRvVFdJUChhY3R1YWxMaW5lSGVpZ2h0KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIDI0MCBUV0lQIG9yIDEyIHBvaW50IGlzIGRlZmF1bHQgbGluZSBoZWlnaHRcclxuICAgICAgcmV0dXJuICtsaW5lSGVpZ2h0ICogMjQwO1xyXG4gICAgfVxyXG4gIH0gZWxzZSB7XHJcbiAgICAvLyAyNDAgVFdJUCBvciAxMiBwb2ludCBpcyBkZWZhdWx0IGxpbmUgaGVpZ2h0XHJcbiAgICByZXR1cm4gMjQwO1xyXG4gIH1cclxufTtcclxuXHJcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb25zaXN0ZW50LXJldHVyblxyXG5jb25zdCBmaXh1cEZvbnRTaXplID0gKGZvbnRTaXplU3RyaW5nKSA9PiB7XHJcbiAgaWYgKHBvaW50UmVnZXgudGVzdChmb250U2l6ZVN0cmluZykpIHtcclxuICAgIGNvbnN0IG1hdGNoZWRQYXJ0cyA9IGZvbnRTaXplU3RyaW5nLm1hdGNoKHBvaW50UmVnZXgpO1xyXG4gICAgLy8gY29udmVydCBwb2ludCB0byBoYWxmIHBvaW50XHJcbiAgICByZXR1cm4gcG9pbnRUb0hJUChtYXRjaGVkUGFydHNbMV0pO1xyXG4gIH0gZWxzZSBpZiAocGl4ZWxSZWdleC50ZXN0KGZvbnRTaXplU3RyaW5nKSkge1xyXG4gICAgY29uc3QgbWF0Y2hlZFBhcnRzID0gZm9udFNpemVTdHJpbmcubWF0Y2gocGl4ZWxSZWdleCk7XHJcbiAgICAvLyBjb252ZXJ0IHBpeGVscyB0byBoYWxmIHBvaW50XHJcbiAgICByZXR1cm4gcGl4ZWxUb0hJUChtYXRjaGVkUGFydHNbMV0pO1xyXG4gIH1cclxufTtcclxuXHJcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb25zaXN0ZW50LXJldHVyblxyXG5jb25zdCBmaXh1cFJvd0hlaWdodCA9IChyb3dIZWlnaHRTdHJpbmcpID0+IHtcclxuICBpZiAocG9pbnRSZWdleC50ZXN0KHJvd0hlaWdodFN0cmluZykpIHtcclxuICAgIGNvbnN0IG1hdGNoZWRQYXJ0cyA9IHJvd0hlaWdodFN0cmluZy5tYXRjaChwb2ludFJlZ2V4KTtcclxuICAgIC8vIGNvbnZlcnQgcG9pbnQgdG8gaGFsZiBwb2ludFxyXG4gICAgcmV0dXJuIHBvaW50VG9UV0lQKG1hdGNoZWRQYXJ0c1sxXSk7XHJcbiAgfSBlbHNlIGlmIChwaXhlbFJlZ2V4LnRlc3Qocm93SGVpZ2h0U3RyaW5nKSkge1xyXG4gICAgY29uc3QgbWF0Y2hlZFBhcnRzID0gcm93SGVpZ2h0U3RyaW5nLm1hdGNoKHBpeGVsUmVnZXgpO1xyXG4gICAgLy8gY29udmVydCBwaXhlbHMgdG8gaGFsZiBwb2ludFxyXG4gICAgcmV0dXJuIHBpeGVsVG9UV0lQKG1hdGNoZWRQYXJ0c1sxXSk7XHJcbiAgfSBlbHNlIGlmIChjbVJlZ2V4LnRlc3Qocm93SGVpZ2h0U3RyaW5nKSkge1xyXG4gICAgY29uc3QgbWF0Y2hlZFBhcnRzID0gcm93SGVpZ2h0U3RyaW5nLm1hdGNoKGNtUmVnZXgpO1xyXG4gICAgcmV0dXJuIGNtVG9UV0lQKG1hdGNoZWRQYXJ0c1sxXSk7XHJcbiAgfSBlbHNlIGlmIChpbmNoUmVnZXgudGVzdChyb3dIZWlnaHRTdHJpbmcpKSB7XHJcbiAgICBjb25zdCBtYXRjaGVkUGFydHMgPSByb3dIZWlnaHRTdHJpbmcubWF0Y2goaW5jaFJlZ2V4KTtcclxuICAgIHJldHVybiBpbmNoVG9UV0lQKG1hdGNoZWRQYXJ0c1sxXSk7XHJcbiAgfVxyXG59O1xyXG5cclxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbnNpc3RlbnQtcmV0dXJuXHJcbmNvbnN0IGZpeHVwQ29sdW1uV2lkdGggPSAoY29sdW1uV2lkdGhTdHJpbmcpID0+IHtcclxuICBpZiAocG9pbnRSZWdleC50ZXN0KGNvbHVtbldpZHRoU3RyaW5nKSkge1xyXG4gICAgY29uc3QgbWF0Y2hlZFBhcnRzID0gY29sdW1uV2lkdGhTdHJpbmcubWF0Y2gocG9pbnRSZWdleCk7XHJcbiAgICByZXR1cm4gcG9pbnRUb1RXSVAobWF0Y2hlZFBhcnRzWzFdKTtcclxuICB9IGVsc2UgaWYgKHBpeGVsUmVnZXgudGVzdChjb2x1bW5XaWR0aFN0cmluZykpIHtcclxuICAgIGNvbnN0IG1hdGNoZWRQYXJ0cyA9IGNvbHVtbldpZHRoU3RyaW5nLm1hdGNoKHBpeGVsUmVnZXgpO1xyXG4gICAgcmV0dXJuIHBpeGVsVG9UV0lQKG1hdGNoZWRQYXJ0c1sxXSk7XHJcbiAgfSBlbHNlIGlmIChjbVJlZ2V4LnRlc3QoY29sdW1uV2lkdGhTdHJpbmcpKSB7XHJcbiAgICBjb25zdCBtYXRjaGVkUGFydHMgPSBjb2x1bW5XaWR0aFN0cmluZy5tYXRjaChjbVJlZ2V4KTtcclxuICAgIHJldHVybiBjbVRvVFdJUChtYXRjaGVkUGFydHNbMV0pO1xyXG4gIH0gZWxzZSBpZiAoaW5jaFJlZ2V4LnRlc3QoY29sdW1uV2lkdGhTdHJpbmcpKSB7XHJcbiAgICBjb25zdCBtYXRjaGVkUGFydHMgPSBjb2x1bW5XaWR0aFN0cmluZy5tYXRjaChpbmNoUmVnZXgpO1xyXG4gICAgcmV0dXJuIGluY2hUb1RXSVAobWF0Y2hlZFBhcnRzWzFdKTtcclxuICB9XHJcbn07XHJcblxyXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29uc2lzdGVudC1yZXR1cm5cclxuY29uc3QgZml4dXBNYXJnaW4gPSAobWFyZ2luU3RyaW5nKSA9PiB7XHJcbiAgaWYgKHBvaW50UmVnZXgudGVzdChtYXJnaW5TdHJpbmcpKSB7XHJcbiAgICBjb25zdCBtYXRjaGVkUGFydHMgPSBtYXJnaW5TdHJpbmcubWF0Y2gocG9pbnRSZWdleCk7XHJcbiAgICAvLyBjb252ZXJ0IHBvaW50IHRvIGhhbGYgcG9pbnRcclxuICAgIHJldHVybiBwb2ludFRvVFdJUChtYXRjaGVkUGFydHNbMV0pO1xyXG4gIH0gZWxzZSBpZiAocGl4ZWxSZWdleC50ZXN0KG1hcmdpblN0cmluZykpIHtcclxuICAgIGNvbnN0IG1hdGNoZWRQYXJ0cyA9IG1hcmdpblN0cmluZy5tYXRjaChwaXhlbFJlZ2V4KTtcclxuICAgIC8vIGNvbnZlcnQgcGl4ZWxzIHRvIGhhbGYgcG9pbnRcclxuICAgIHJldHVybiBwaXhlbFRvVFdJUChtYXRjaGVkUGFydHNbMV0pO1xyXG4gIH1cclxufTtcclxuXHJcbmNvbnN0IG1vZGlmaWVkU3R5bGVBdHRyaWJ1dGVzQnVpbGRlciA9ICh2Tm9kZSwgYXR0cmlidXRlcywgb3B0aW9ucykgPT4ge1xyXG4gIGNvbnN0IG1vZGlmaWVkQXR0cmlidXRlcyA9IHsgLi4uYXR0cmlidXRlcyB9O1xyXG5cclxuICAvLyBzdHlsZXNcclxuICBpZiAoaXNWTm9kZSh2Tm9kZSkgJiYgdk5vZGUucHJvcGVydGllcyAmJiB2Tm9kZS5wcm9wZXJ0aWVzLnN0eWxlKSB7XHJcbiAgICBpZiAodk5vZGUucHJvcGVydGllcy5zdHlsZS5jb2xvciAmJiAhY29sb3JsZXNzQ29sb3JzLmluY2x1ZGVzKHZOb2RlLnByb3BlcnRpZXMuc3R5bGUuY29sb3IpKSB7XHJcbiAgICAgIG1vZGlmaWVkQXR0cmlidXRlcy5jb2xvciA9IGZpeHVwQ29sb3JDb2RlKHZOb2RlLnByb3BlcnRpZXMuc3R5bGUuY29sb3IpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChcclxuICAgICAgdk5vZGUucHJvcGVydGllcy5zdHlsZVsnYmFja2dyb3VuZC1jb2xvciddICYmXHJcbiAgICAgICFjb2xvcmxlc3NDb2xvcnMuaW5jbHVkZXModk5vZGUucHJvcGVydGllcy5zdHlsZVsnYmFja2dyb3VuZC1jb2xvciddKVxyXG4gICAgKSB7XHJcbiAgICAgIG1vZGlmaWVkQXR0cmlidXRlcy5iYWNrZ3JvdW5kQ29sb3IgPSBmaXh1cENvbG9yQ29kZShcclxuICAgICAgICB2Tm9kZS5wcm9wZXJ0aWVzLnN0eWxlWydiYWNrZ3JvdW5kLWNvbG9yJ11cclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoXHJcbiAgICAgIHZOb2RlLnByb3BlcnRpZXMuc3R5bGVbJ3ZlcnRpY2FsLWFsaWduJ10gJiZcclxuICAgICAgdmVydGljYWxBbGlnblZhbHVlcy5pbmNsdWRlcyh2Tm9kZS5wcm9wZXJ0aWVzLnN0eWxlWyd2ZXJ0aWNhbC1hbGlnbiddKVxyXG4gICAgKSB7XHJcbiAgICAgIG1vZGlmaWVkQXR0cmlidXRlcy52ZXJ0aWNhbEFsaWduID0gdk5vZGUucHJvcGVydGllcy5zdHlsZVsndmVydGljYWwtYWxpZ24nXTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoXHJcbiAgICAgIHZOb2RlLnByb3BlcnRpZXMuc3R5bGVbJ3RleHQtYWxpZ24nXSAmJlxyXG4gICAgICBbJ2xlZnQnLCAncmlnaHQnLCAnY2VudGVyJywgJ2p1c3RpZnknXS5pbmNsdWRlcyh2Tm9kZS5wcm9wZXJ0aWVzLnN0eWxlWyd0ZXh0LWFsaWduJ10pXHJcbiAgICApIHtcclxuICAgICAgbW9kaWZpZWRBdHRyaWJ1dGVzLnRleHRBbGlnbiA9IHZOb2RlLnByb3BlcnRpZXMuc3R5bGVbJ3RleHQtYWxpZ24nXTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBGSVhNRTogcmVtb3ZlIGJvbGQgY2hlY2sgd2hlbiBvdGhlciBmb250IHdlaWdodHMgYXJlIGhhbmRsZWQuXHJcbiAgICBpZiAodk5vZGUucHJvcGVydGllcy5zdHlsZVsnZm9udC13ZWlnaHQnXSAmJiB2Tm9kZS5wcm9wZXJ0aWVzLnN0eWxlWydmb250LXdlaWdodCddID09PSAnYm9sZCcpIHtcclxuICAgICAgbW9kaWZpZWRBdHRyaWJ1dGVzLnN0cm9uZyA9IHZOb2RlLnByb3BlcnRpZXMuc3R5bGVbJ2ZvbnQtd2VpZ2h0J107XHJcbiAgICB9XHJcbiAgICBpZiAodk5vZGUucHJvcGVydGllcy5zdHlsZVsnZm9udC1zaXplJ10pIHtcclxuICAgICAgbW9kaWZpZWRBdHRyaWJ1dGVzLmZvbnRTaXplID0gZml4dXBGb250U2l6ZSh2Tm9kZS5wcm9wZXJ0aWVzLnN0eWxlWydmb250LXNpemUnXSk7XHJcbiAgICB9XHJcbiAgICBpZiAodk5vZGUucHJvcGVydGllcy5zdHlsZVsnbGluZS1oZWlnaHQnXSkge1xyXG4gICAgICBtb2RpZmllZEF0dHJpYnV0ZXMubGluZUhlaWdodCA9IGZpeHVwTGluZUhlaWdodChcclxuICAgICAgICB2Tm9kZS5wcm9wZXJ0aWVzLnN0eWxlWydsaW5lLWhlaWdodCddLFxyXG4gICAgICAgIHZOb2RlLnByb3BlcnRpZXMuc3R5bGVbJ2ZvbnQtc2l6ZSddXHJcbiAgICAgICAgICA/IGZpeHVwRm9udFNpemUodk5vZGUucHJvcGVydGllcy5zdHlsZVsnZm9udC1zaXplJ10pXHJcbiAgICAgICAgICA6IG51bGxcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIGlmICh2Tm9kZS5wcm9wZXJ0aWVzLnN0eWxlWydtYXJnaW4tbGVmdCddIHx8IHZOb2RlLnByb3BlcnRpZXMuc3R5bGVbJ21hcmdpbi1yaWdodCddKSB7XHJcbiAgICAgIGNvbnN0IGxlZnRNYXJnaW4gPSBmaXh1cE1hcmdpbih2Tm9kZS5wcm9wZXJ0aWVzLnN0eWxlWydtYXJnaW4tbGVmdCddKTtcclxuICAgICAgY29uc3QgcmlnaHRNYXJnaW4gPSBmaXh1cE1hcmdpbih2Tm9kZS5wcm9wZXJ0aWVzLnN0eWxlWydtYXJnaW4tcmlnaHQnXSk7XHJcbiAgICAgIGNvbnN0IGluZGVudGF0aW9uID0ge307XHJcbiAgICAgIGlmIChsZWZ0TWFyZ2luKSB7XHJcbiAgICAgICAgaW5kZW50YXRpb24ubGVmdCA9IGxlZnRNYXJnaW47XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHJpZ2h0TWFyZ2luKSB7XHJcbiAgICAgICAgaW5kZW50YXRpb24ucmlnaHQgPSByaWdodE1hcmdpbjtcclxuICAgICAgfVxyXG4gICAgICBpZiAobGVmdE1hcmdpbiB8fCByaWdodE1hcmdpbikge1xyXG4gICAgICAgIG1vZGlmaWVkQXR0cmlidXRlcy5pbmRlbnRhdGlvbiA9IGluZGVudGF0aW9uO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAodk5vZGUucHJvcGVydGllcy5zdHlsZS5kaXNwbGF5KSB7XHJcbiAgICAgIG1vZGlmaWVkQXR0cmlidXRlcy5kaXNwbGF5ID0gdk5vZGUucHJvcGVydGllcy5zdHlsZS5kaXNwbGF5O1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh2Tm9kZS5wcm9wZXJ0aWVzLnN0eWxlLndpZHRoKSB7XHJcbiAgICAgIG1vZGlmaWVkQXR0cmlidXRlcy53aWR0aCA9IHZOb2RlLnByb3BlcnRpZXMuc3R5bGUud2lkdGg7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBwYXJhZ3JhcGggb25seVxyXG4gIGlmIChvcHRpb25zICYmIG9wdGlvbnMuaXNQYXJhZ3JhcGgpIHtcclxuICAgIGlmIChpc1ZOb2RlKHZOb2RlKSAmJiB2Tm9kZS50YWdOYW1lID09PSAnYmxvY2txdW90ZScpIHtcclxuICAgICAgbW9kaWZpZWRBdHRyaWJ1dGVzLmluZGVudGF0aW9uID0geyBsZWZ0OiAyODQgfTtcclxuICAgICAgbW9kaWZpZWRBdHRyaWJ1dGVzLnRleHRBbGlnbiA9ICdqdXN0aWZ5JztcclxuICAgIH0gZWxzZSBpZiAoaXNWTm9kZSh2Tm9kZSkgJiYgdk5vZGUudGFnTmFtZSA9PT0gJ2NvZGUnKSB7XHJcbiAgICAgIG1vZGlmaWVkQXR0cmlidXRlcy5oaWdobGlnaHRDb2xvciA9ICdsaWdodEdyYXknO1xyXG4gICAgfSBlbHNlIGlmIChpc1ZOb2RlKHZOb2RlKSAmJiB2Tm9kZS50YWdOYW1lID09PSAncHJlJykge1xyXG4gICAgICBtb2RpZmllZEF0dHJpYnV0ZXMuZm9udCA9ICdDb3VyaWVyJztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJldHVybiBtb2RpZmllZEF0dHJpYnV0ZXM7XHJcbn07XHJcblxyXG4vLyBodG1sIHRhZyB0byBmb3JtYXR0aW5nIGZ1bmN0aW9uXHJcbi8vIG9wdGlvbnMgYXJlIHBhc3NlZCB0byB0aGUgZm9ybWF0dGluZyBmdW5jdGlvbiBpZiBuZWVkZWRcclxuY29uc3QgYnVpbGRGb3JtYXR0aW5nID0gKGh0bWxUYWcsIG9wdGlvbnMpID0+IHtcclxuICBzd2l0Y2ggKGh0bWxUYWcpIHtcclxuICAgIGNhc2UgJ3N0cm9uZyc6XHJcbiAgICBjYXNlICdiJzpcclxuICAgICAgcmV0dXJuIGJ1aWxkQm9sZCgpO1xyXG4gICAgY2FzZSAnZW0nOlxyXG4gICAgY2FzZSAnaSc6XHJcbiAgICAgIHJldHVybiBidWlsZEl0YWxpY3MoKTtcclxuICAgIGNhc2UgJ2lucyc6XHJcbiAgICBjYXNlICd1JzpcclxuICAgICAgcmV0dXJuIGJ1aWxkVW5kZXJsaW5lKCk7XHJcbiAgICBjYXNlICdzdHJpa2UnOlxyXG4gICAgY2FzZSAnZGVsJzpcclxuICAgIGNhc2UgJ3MnOlxyXG4gICAgICByZXR1cm4gYnVpbGRTdHJpa2UoKTtcclxuICAgIGNhc2UgJ3N1Yic6XHJcbiAgICAgIHJldHVybiBidWlsZFZlcnRBbGlnbignc3Vic2NyaXB0Jyk7XHJcbiAgICBjYXNlICdzdXAnOlxyXG4gICAgICByZXR1cm4gYnVpbGRWZXJ0QWxpZ24oJ3N1cGVyc2NyaXB0Jyk7XHJcbiAgICBjYXNlICdtYXJrJzpcclxuICAgICAgcmV0dXJuIGJ1aWxkSGlnaGxpZ2h0KCk7XHJcbiAgICBjYXNlICdjb2RlJzpcclxuICAgICAgcmV0dXJuIGJ1aWxkSGlnaGxpZ2h0KCdsaWdodEdyYXknKTtcclxuICAgIGNhc2UgJ2hpZ2hsaWdodENvbG9yJzpcclxuICAgICAgcmV0dXJuIGJ1aWxkSGlnaGxpZ2h0KG9wdGlvbnMgJiYgb3B0aW9ucy5jb2xvciA/IG9wdGlvbnMuY29sb3IgOiAnbGlnaHRHcmF5Jyk7XHJcbiAgICBjYXNlICdmb250JzpcclxuICAgIGNhc2UgJ3ByZSc6XHJcbiAgICAgIHJldHVybiBidWlsZFJ1bkZvbnRGcmFnbWVudCgnQ291cmllcicpO1xyXG4gICAgY2FzZSAnY29sb3InOlxyXG4gICAgICByZXR1cm4gYnVpbGRDb2xvcihvcHRpb25zICYmIG9wdGlvbnMuY29sb3IgPyBvcHRpb25zLmNvbG9yIDogJ2JsYWNrJyk7XHJcbiAgICBjYXNlICdiYWNrZ3JvdW5kQ29sb3InOlxyXG4gICAgICByZXR1cm4gYnVpbGRTaGFkaW5nKG9wdGlvbnMgJiYgb3B0aW9ucy5jb2xvciA/IG9wdGlvbnMuY29sb3IgOiAnYmxhY2snKTtcclxuICAgIGNhc2UgJ2ZvbnRTaXplJzpcclxuICAgICAgLy8gZG9lcyB0aGlzIG5lZWQgYSB1bml0IG9mIG1lYXN1cmU/XHJcbiAgICAgIHJldHVybiBidWlsZEZvbnRTaXplKG9wdGlvbnMgJiYgb3B0aW9ucy5mb250U2l6ZSA/IG9wdGlvbnMuZm9udFNpemUgOiAxMCk7XHJcbiAgICBjYXNlICdoeXBlcmxpbmsnOlxyXG4gICAgICByZXR1cm4gYnVpbGRSdW5TdHlsZUZyYWdtZW50KCdIeXBlcmxpbmsnKTtcclxuICB9XHJcblxyXG4gIHJldHVybiBudWxsO1xyXG59O1xyXG5cclxuY29uc3QgYnVpbGRSdW5Qcm9wZXJ0aWVzID0gKGF0dHJpYnV0ZXMpID0+IHtcclxuICBjb25zdCBydW5Qcm9wZXJ0aWVzRnJhZ21lbnQgPSBmcmFnbWVudCh7IG5hbWVzcGFjZUFsaWFzOiB7IHc6IG5hbWVzcGFjZXMudyB9IH0pLmVsZSgnQHcnLCAnclByJyk7XHJcbiAgaWYgKGF0dHJpYnV0ZXMgJiYgYXR0cmlidXRlcy5jb25zdHJ1Y3RvciA9PT0gT2JqZWN0KSB7XHJcbiAgICBPYmplY3Qua2V5cyhhdHRyaWJ1dGVzKS5mb3JFYWNoKChrZXkpID0+IHtcclxuICAgICAgY29uc3Qgb3B0aW9ucyA9IHt9O1xyXG4gICAgICBpZiAoa2V5ID09PSAnY29sb3InIHx8IGtleSA9PT0gJ2JhY2tncm91bmRDb2xvcicgfHwga2V5ID09PSAnaGlnaGxpZ2h0Q29sb3InKSB7XHJcbiAgICAgICAgb3B0aW9ucy5jb2xvciA9IGF0dHJpYnV0ZXNba2V5XTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGtleSA9PT0gJ2ZvbnRTaXplJykge1xyXG4gICAgICAgIG9wdGlvbnMuZm9udFNpemUgPSBhdHRyaWJ1dGVzW2tleV07XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IGZvcm1hdHRpbmdGcmFnbWVudCA9IGJ1aWxkRm9ybWF0dGluZyhrZXksIG9wdGlvbnMpO1xyXG4gICAgICBpZiAoZm9ybWF0dGluZ0ZyYWdtZW50KSB7XHJcbiAgICAgICAgcnVuUHJvcGVydGllc0ZyYWdtZW50LmltcG9ydChmb3JtYXR0aW5nRnJhZ21lbnQpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcbiAgcnVuUHJvcGVydGllc0ZyYWdtZW50LnVwKCk7XHJcblxyXG4gIHJldHVybiBydW5Qcm9wZXJ0aWVzRnJhZ21lbnQ7XHJcbn07XHJcblxyXG5jb25zdCBidWlsZFJ1biA9IGFzeW5jICh2Tm9kZSwgYXR0cmlidXRlcywgZG9jeERvY3VtZW50SW5zdGFuY2UpID0+IHtcclxuICBjb25zdCBydW5GcmFnbWVudCA9IGZyYWdtZW50KHsgbmFtZXNwYWNlQWxpYXM6IHsgdzogbmFtZXNwYWNlcy53IH0gfSkuZWxlKCdAdycsICdyJyk7XHJcbiAgY29uc3QgcnVuUHJvcGVydGllc0ZyYWdtZW50ID0gYnVpbGRSdW5Qcm9wZXJ0aWVzKGNsb25lRGVlcChhdHRyaWJ1dGVzKSk7XHJcblxyXG4gIC8vIGNhc2Ugd2hlcmUgd2UgaGF2ZSByZWN1cnNpdmUgc3BhbnMgcmVwcmVzZW50aW5nIGZvbnQgY2hhbmdlc1xyXG4gIGlmIChpc1ZOb2RlKHZOb2RlKSAmJiB2Tm9kZS50YWdOYW1lID09PSAnc3BhbicpIHtcclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZVxyXG4gICAgcmV0dXJuIGJ1aWxkUnVuT3JSdW5zKHZOb2RlLCBhdHRyaWJ1dGVzLCBkb2N4RG9jdW1lbnRJbnN0YW5jZSk7XHJcbiAgfVxyXG5cclxuICBpZiAoXHJcbiAgICBpc1ZOb2RlKHZOb2RlKSAmJlxyXG4gICAgW1xyXG4gICAgICAnc3Ryb25nJyxcclxuICAgICAgJ2InLFxyXG4gICAgICAnZW0nLFxyXG4gICAgICAnaScsXHJcbiAgICAgICd1JyxcclxuICAgICAgJ2lucycsXHJcbiAgICAgICdzdHJpa2UnLFxyXG4gICAgICAnZGVsJyxcclxuICAgICAgJ3MnLFxyXG4gICAgICAnc3ViJyxcclxuICAgICAgJ3N1cCcsXHJcbiAgICAgICdtYXJrJyxcclxuICAgICAgJ2Jsb2NrcXVvdGUnLFxyXG4gICAgICAnY29kZScsXHJcbiAgICAgICdwcmUnLFxyXG4gICAgXS5pbmNsdWRlcyh2Tm9kZS50YWdOYW1lKVxyXG4gICkge1xyXG4gICAgY29uc3QgcnVuRnJhZ21lbnRzQXJyYXkgPSBbXTtcclxuXHJcbiAgICBsZXQgdk5vZGVzID0gW3ZOb2RlXTtcclxuICAgIC8vIGNyZWF0ZSB0ZW1wIHJ1biBmcmFnbWVudHMgdG8gc3BsaXQgdGhlIHBhcmFncmFwaCBpbnRvIGRpZmZlcmVudCBydW5zXHJcbiAgICBsZXQgdGVtcEF0dHJpYnV0ZXMgPSBjbG9uZURlZXAoYXR0cmlidXRlcyk7XHJcbiAgICBsZXQgdGVtcFJ1bkZyYWdtZW50ID0gZnJhZ21lbnQoeyBuYW1lc3BhY2VBbGlhczogeyB3OiBuYW1lc3BhY2VzLncgfSB9KS5lbGUoJ0B3JywgJ3InKTtcclxuICAgIHdoaWxlICh2Tm9kZXMubGVuZ3RoKSB7XHJcbiAgICAgIGNvbnN0IHRlbXBWTm9kZSA9IHZOb2Rlcy5zaGlmdCgpO1xyXG4gICAgICBpZiAoaXNWVGV4dCh0ZW1wVk5vZGUpKSB7XHJcbiAgICAgICAgY29uc3QgdGV4dEZyYWdtZW50ID0gYnVpbGRUZXh0RWxlbWVudCh0ZW1wVk5vZGUudGV4dCk7XHJcbiAgICAgICAgY29uc3QgdGVtcFJ1blByb3BlcnRpZXNGcmFnbWVudCA9IGJ1aWxkUnVuUHJvcGVydGllcyh7IC4uLmF0dHJpYnV0ZXMsIC4uLnRlbXBBdHRyaWJ1dGVzIH0pO1xyXG4gICAgICAgIHRlbXBSdW5GcmFnbWVudC5pbXBvcnQodGVtcFJ1blByb3BlcnRpZXNGcmFnbWVudCk7XHJcbiAgICAgICAgdGVtcFJ1bkZyYWdtZW50LmltcG9ydCh0ZXh0RnJhZ21lbnQpO1xyXG4gICAgICAgIHJ1bkZyYWdtZW50c0FycmF5LnB1c2godGVtcFJ1bkZyYWdtZW50KTtcclxuXHJcbiAgICAgICAgLy8gcmUgaW5pdGlhbGl6ZSB0ZW1wIHJ1biBmcmFnbWVudHMgd2l0aCBuZXcgZnJhZ21lbnRcclxuICAgICAgICB0ZW1wQXR0cmlidXRlcyA9IGNsb25lRGVlcChhdHRyaWJ1dGVzKTtcclxuICAgICAgICB0ZW1wUnVuRnJhZ21lbnQgPSBmcmFnbWVudCh7IG5hbWVzcGFjZUFsaWFzOiB7IHc6IG5hbWVzcGFjZXMudyB9IH0pLmVsZSgnQHcnLCAncicpO1xyXG4gICAgICB9IGVsc2UgaWYgKGlzVk5vZGUodGVtcFZOb2RlKSkge1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIFtcclxuICAgICAgICAgICAgJ3N0cm9uZycsXHJcbiAgICAgICAgICAgICdiJyxcclxuICAgICAgICAgICAgJ2VtJyxcclxuICAgICAgICAgICAgJ2knLFxyXG4gICAgICAgICAgICAndScsXHJcbiAgICAgICAgICAgICdpbnMnLFxyXG4gICAgICAgICAgICAnc3RyaWtlJyxcclxuICAgICAgICAgICAgJ2RlbCcsXHJcbiAgICAgICAgICAgICdzJyxcclxuICAgICAgICAgICAgJ3N1YicsXHJcbiAgICAgICAgICAgICdzdXAnLFxyXG4gICAgICAgICAgICAnbWFyaycsXHJcbiAgICAgICAgICAgICdjb2RlJyxcclxuICAgICAgICAgICAgJ3ByZScsXHJcbiAgICAgICAgICBdLmluY2x1ZGVzKHRlbXBWTm9kZS50YWdOYW1lKVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgdGVtcEF0dHJpYnV0ZXMgPSB7fTtcclxuICAgICAgICAgIHN3aXRjaCAodGVtcFZOb2RlLnRhZ05hbWUpIHtcclxuICAgICAgICAgICAgY2FzZSAnc3Ryb25nJzpcclxuICAgICAgICAgICAgY2FzZSAnYic6XHJcbiAgICAgICAgICAgICAgdGVtcEF0dHJpYnV0ZXMuc3Ryb25nID0gdHJ1ZTtcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAnaSc6XHJcbiAgICAgICAgICAgICAgdGVtcEF0dHJpYnV0ZXMuaSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgJ3UnOlxyXG4gICAgICAgICAgICAgIHRlbXBBdHRyaWJ1dGVzLnUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlICdzdWInOlxyXG4gICAgICAgICAgICAgIHRlbXBBdHRyaWJ1dGVzLnN1YiA9IHRydWU7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgJ3N1cCc6XHJcbiAgICAgICAgICAgICAgdGVtcEF0dHJpYnV0ZXMuc3VwID0gdHJ1ZTtcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGNvbnN0IGZvcm1hdHRpbmdGcmFnbWVudCA9IGJ1aWxkRm9ybWF0dGluZyh0ZW1wVk5vZGUpO1xyXG5cclxuICAgICAgICAgIGlmIChmb3JtYXR0aW5nRnJhZ21lbnQpIHtcclxuICAgICAgICAgICAgcnVuUHJvcGVydGllc0ZyYWdtZW50LmltcG9ydChmb3JtYXR0aW5nRnJhZ21lbnQpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgLy8gZ28gYSBsYXllciBkZWVwZXIgaWYgdGhlcmUgaXMgYSBzcGFuIHNvbWV3aGVyZSBpbiB0aGUgY2hpbGRyZW5cclxuICAgICAgICB9IGVsc2UgaWYgKHRlbXBWTm9kZS50YWdOYW1lID09PSAnc3BhbicpIHtcclxuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZVxyXG4gICAgICAgICAgY29uc3Qgc3BhbkZyYWdtZW50ID0gYXdhaXQgYnVpbGRSdW5PclJ1bnMoXHJcbiAgICAgICAgICAgIHRlbXBWTm9kZSxcclxuICAgICAgICAgICAgeyAuLi5hdHRyaWJ1dGVzLCAuLi50ZW1wQXR0cmlidXRlcyB9LFxyXG4gICAgICAgICAgICBkb2N4RG9jdW1lbnRJbnN0YW5jZVxyXG4gICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICAvLyBpZiBzcGFuRnJhZ21lbnQgaXMgYW4gYXJyYXksIHdlIG5lZWQgdG8gYWRkIGVhY2ggZnJhZ21lbnQgdG8gdGhlIHJ1bkZyYWdtZW50c0FycmF5LiBJZiB0aGUgZnJhZ21lbnQgaXMgYW4gYXJyYXksIHBlcmZvcm0gYSBkZXB0aCBmaXJzdCBzZWFyY2ggb24gdGhlIGFycmF5IHRvIGFkZCBlYWNoIGZyYWdtZW50IHRvIHRoZSBydW5GcmFnbWVudHNBcnJheVxyXG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc3BhbkZyYWdtZW50KSkge1xyXG4gICAgICAgICAgICBzcGFuRnJhZ21lbnQuZmxhdChJbmZpbml0eSk7XHJcbiAgICAgICAgICAgIHJ1bkZyYWdtZW50c0FycmF5LnB1c2goLi4uc3BhbkZyYWdtZW50KTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJ1bkZyYWdtZW50c0FycmF5LnB1c2goc3BhbkZyYWdtZW50KTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAvLyBkbyBub3Qgc2xpY2UgYW5kIGNvbmNhdCBjaGlsZHJlbiBzaW5jZSB0aGlzIGlzIGFscmVhZHkgYWNjb3VudGVkIGZvciBpbiB0aGUgYnVpbGRSdW5PclJ1bnMgZnVuY3Rpb25cclxuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb250aW51ZVxyXG4gICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodGVtcFZOb2RlLmNoaWxkcmVuICYmIHRlbXBWTm9kZS5jaGlsZHJlbi5sZW5ndGgpIHtcclxuICAgICAgICBpZiAodGVtcFZOb2RlLmNoaWxkcmVuLmxlbmd0aCA+IDEpIHtcclxuICAgICAgICAgIGF0dHJpYnV0ZXMgPSB7IC4uLmF0dHJpYnV0ZXMsIC4uLnRlbXBBdHRyaWJ1dGVzIH07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2Tm9kZXMgPSB0ZW1wVk5vZGUuY2hpbGRyZW4uc2xpY2UoKS5jb25jYXQodk5vZGVzKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKHJ1bkZyYWdtZW50c0FycmF5Lmxlbmd0aCkge1xyXG4gICAgICByZXR1cm4gcnVuRnJhZ21lbnRzQXJyYXk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBydW5GcmFnbWVudC5pbXBvcnQocnVuUHJvcGVydGllc0ZyYWdtZW50KTtcclxuICBpZiAoaXNWVGV4dCh2Tm9kZSkpIHtcclxuICAgIGNvbnN0IHRleHRGcmFnbWVudCA9IGJ1aWxkVGV4dEVsZW1lbnQodk5vZGUudGV4dCk7XHJcbiAgICBydW5GcmFnbWVudC5pbXBvcnQodGV4dEZyYWdtZW50KTtcclxuICB9IGVsc2UgaWYgKGF0dHJpYnV0ZXMgJiYgYXR0cmlidXRlcy50eXBlID09PSAncGljdHVyZScpIHtcclxuICAgIGxldCByZXNwb25zZSA9IG51bGw7XHJcblxyXG4gICAgY29uc3QgYmFzZTY0VXJpID0gZGVjb2RlVVJJQ29tcG9uZW50KHZOb2RlLnByb3BlcnRpZXMuc3JjKTtcclxuICAgIGlmIChiYXNlNjRVcmkpIHtcclxuICAgICAgcmVzcG9uc2UgPSBkb2N4RG9jdW1lbnRJbnN0YW5jZS5jcmVhdGVNZWRpYUZpbGUoYmFzZTY0VXJpKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAocmVzcG9uc2UpIHtcclxuICAgICAgZG9jeERvY3VtZW50SW5zdGFuY2UuemlwXHJcbiAgICAgICAgLmZvbGRlcignd29yZCcpXHJcbiAgICAgICAgLmZvbGRlcignbWVkaWEnKVxyXG4gICAgICAgIC5maWxlKHJlc3BvbnNlLmZpbGVOYW1lV2l0aEV4dGVuc2lvbiwgQnVmZmVyLmZyb20ocmVzcG9uc2UuZmlsZUNvbnRlbnQsICdiYXNlNjQnKSwge1xyXG4gICAgICAgICAgY3JlYXRlRm9sZGVyczogZmFsc2UsXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICBjb25zdCBkb2N1bWVudFJlbHNJZCA9IGRvY3hEb2N1bWVudEluc3RhbmNlLmNyZWF0ZURvY3VtZW50UmVsYXRpb25zaGlwcyhcclxuICAgICAgICBkb2N4RG9jdW1lbnRJbnN0YW5jZS5yZWxhdGlvbnNoaXBGaWxlbmFtZSxcclxuICAgICAgICBpbWFnZVR5cGUsXHJcbiAgICAgICAgYG1lZGlhLyR7cmVzcG9uc2UuZmlsZU5hbWVXaXRoRXh0ZW5zaW9ufWAsXHJcbiAgICAgICAgaW50ZXJuYWxSZWxhdGlvbnNoaXBcclxuICAgICAgKTtcclxuXHJcbiAgICAgIGF0dHJpYnV0ZXMuaW5saW5lT3JBbmNob3JlZCA9IHRydWU7XHJcbiAgICAgIGF0dHJpYnV0ZXMucmVsYXRpb25zaGlwSWQgPSBkb2N1bWVudFJlbHNJZDtcclxuICAgICAgYXR0cmlidXRlcy5pZCA9IHJlc3BvbnNlLmlkO1xyXG4gICAgICBhdHRyaWJ1dGVzLmZpbGVDb250ZW50ID0gcmVzcG9uc2UuZmlsZUNvbnRlbnQ7XHJcbiAgICAgIGF0dHJpYnV0ZXMuZmlsZU5hbWVXaXRoRXh0ZW5zaW9uID0gcmVzcG9uc2UuZmlsZU5hbWVXaXRoRXh0ZW5zaW9uO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHsgdHlwZSwgaW5saW5lT3JBbmNob3JlZCwgLi4ub3RoZXJBdHRyaWJ1dGVzIH0gPSBhdHRyaWJ1dGVzO1xyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lXHJcbiAgICBjb25zdCBpbWFnZUZyYWdtZW50ID0gYnVpbGREcmF3aW5nKGlubGluZU9yQW5jaG9yZWQsIHR5cGUsIG90aGVyQXR0cmlidXRlcyk7XHJcbiAgICBydW5GcmFnbWVudC5pbXBvcnQoaW1hZ2VGcmFnbWVudCk7XHJcbiAgfSBlbHNlIGlmIChpc1ZOb2RlKHZOb2RlKSAmJiB2Tm9kZS50YWdOYW1lID09PSAnYnInKSB7XHJcbiAgICBjb25zdCBsaW5lQnJlYWtGcmFnbWVudCA9IGJ1aWxkTGluZUJyZWFrKCk7XHJcbiAgICBydW5GcmFnbWVudC5pbXBvcnQobGluZUJyZWFrRnJhZ21lbnQpO1xyXG4gIH1cclxuICBydW5GcmFnbWVudC51cCgpO1xyXG5cclxuICByZXR1cm4gcnVuRnJhZ21lbnQ7XHJcbn07XHJcblxyXG5jb25zdCBidWlsZFJ1bk9yUnVucyA9IGFzeW5jICh2Tm9kZSwgYXR0cmlidXRlcywgZG9jeERvY3VtZW50SW5zdGFuY2UpID0+IHtcclxuICBpZiAoaXNWTm9kZSh2Tm9kZSkgJiYgdk5vZGUudGFnTmFtZSA9PT0gJ3NwYW4nKSB7XHJcbiAgICBsZXQgcnVuRnJhZ21lbnRzID0gW107XHJcblxyXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHZOb2RlLmNoaWxkcmVuLmxlbmd0aDsgaW5kZXgrKykge1xyXG4gICAgICBjb25zdCBjaGlsZFZOb2RlID0gdk5vZGUuY2hpbGRyZW5baW5kZXhdO1xyXG4gICAgICBjb25zdCBtb2RpZmllZEF0dHJpYnV0ZXMgPSBtb2RpZmllZFN0eWxlQXR0cmlidXRlc0J1aWxkZXIodk5vZGUsIGF0dHJpYnV0ZXMpO1xyXG4gICAgICBjb25zdCB0ZW1wUnVuRnJhZ21lbnRzID0gYXdhaXQgYnVpbGRSdW4oY2hpbGRWTm9kZSwgbW9kaWZpZWRBdHRyaWJ1dGVzLCBkb2N4RG9jdW1lbnRJbnN0YW5jZSk7XHJcbiAgICAgIHJ1bkZyYWdtZW50cyA9IHJ1bkZyYWdtZW50cy5jb25jYXQoXHJcbiAgICAgICAgQXJyYXkuaXNBcnJheSh0ZW1wUnVuRnJhZ21lbnRzKSA/IHRlbXBSdW5GcmFnbWVudHMgOiBbdGVtcFJ1bkZyYWdtZW50c11cclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcnVuRnJhZ21lbnRzO1xyXG4gIH0gZWxzZSB7XHJcbiAgICBjb25zdCB0ZW1wUnVuRnJhZ21lbnRzID0gYXdhaXQgYnVpbGRSdW4odk5vZGUsIGF0dHJpYnV0ZXMsIGRvY3hEb2N1bWVudEluc3RhbmNlKTtcclxuICAgIHJldHVybiB0ZW1wUnVuRnJhZ21lbnRzO1xyXG4gIH1cclxufTtcclxuXHJcbmNvbnN0IGJ1aWxkUnVuT3JIeXBlckxpbmsgPSBhc3luYyAodk5vZGUsIGF0dHJpYnV0ZXMsIGRvY3hEb2N1bWVudEluc3RhbmNlKSA9PiB7XHJcbiAgaWYgKGlzVk5vZGUodk5vZGUpICYmIHZOb2RlLnRhZ05hbWUgPT09ICdhJykge1xyXG4gICAgY29uc3QgcmVsYXRpb25zaGlwSWQgPSBkb2N4RG9jdW1lbnRJbnN0YW5jZS5jcmVhdGVEb2N1bWVudFJlbGF0aW9uc2hpcHMoXHJcbiAgICAgIGRvY3hEb2N1bWVudEluc3RhbmNlLnJlbGF0aW9uc2hpcEZpbGVuYW1lLFxyXG4gICAgICBoeXBlcmxpbmtUeXBlLFxyXG4gICAgICB2Tm9kZS5wcm9wZXJ0aWVzICYmIHZOb2RlLnByb3BlcnRpZXMuaHJlZiA/IHZOb2RlLnByb3BlcnRpZXMuaHJlZiA6ICcnXHJcbiAgICApO1xyXG4gICAgY29uc3QgaHlwZXJsaW5rRnJhZ21lbnQgPSBmcmFnbWVudCh7IG5hbWVzcGFjZUFsaWFzOiB7IHc6IG5hbWVzcGFjZXMudywgcjogbmFtZXNwYWNlcy5yIH0gfSlcclxuICAgICAgLmVsZSgnQHcnLCAnaHlwZXJsaW5rJylcclxuICAgICAgLmF0dCgnQHInLCAnaWQnLCBgcklkJHtyZWxhdGlvbnNoaXBJZH1gKTtcclxuXHJcbiAgICBjb25zdCBtb2RpZmllZEF0dHJpYnV0ZXMgPSB7IC4uLmF0dHJpYnV0ZXMgfTtcclxuICAgIG1vZGlmaWVkQXR0cmlidXRlcy5oeXBlcmxpbmsgPSB0cnVlO1xyXG5cclxuICAgIGNvbnN0IHJ1bkZyYWdtZW50cyA9IGF3YWl0IGJ1aWxkUnVuT3JSdW5zKFxyXG4gICAgICB2Tm9kZS5jaGlsZHJlblswXSxcclxuICAgICAgbW9kaWZpZWRBdHRyaWJ1dGVzLFxyXG4gICAgICBkb2N4RG9jdW1lbnRJbnN0YW5jZVxyXG4gICAgKTtcclxuICAgIGlmIChBcnJheS5pc0FycmF5KHJ1bkZyYWdtZW50cykpIHtcclxuICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHJ1bkZyYWdtZW50cy5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgICBjb25zdCBydW5GcmFnbWVudCA9IHJ1bkZyYWdtZW50c1tpbmRleF07XHJcblxyXG4gICAgICAgIGh5cGVybGlua0ZyYWdtZW50LmltcG9ydChydW5GcmFnbWVudCk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGh5cGVybGlua0ZyYWdtZW50LmltcG9ydChydW5GcmFnbWVudHMpO1xyXG4gICAgfVxyXG4gICAgaHlwZXJsaW5rRnJhZ21lbnQudXAoKTtcclxuXHJcbiAgICByZXR1cm4gaHlwZXJsaW5rRnJhZ21lbnQ7XHJcbiAgfVxyXG5cclxuICBjb25zdCBydW5GcmFnbWVudHMgPSBhd2FpdCBidWlsZFJ1bk9yUnVucyh2Tm9kZSwgYXR0cmlidXRlcywgZG9jeERvY3VtZW50SW5zdGFuY2UpO1xyXG5cclxuICByZXR1cm4gcnVuRnJhZ21lbnRzO1xyXG59O1xyXG5cclxuY29uc3QgYnVpbGROdW1iZXJpbmdQcm9wZXJ0aWVzID0gKGxldmVsSWQsIG51bWJlcmluZ0lkKSA9PlxyXG4gIGZyYWdtZW50KHsgbmFtZXNwYWNlQWxpYXM6IHsgdzogbmFtZXNwYWNlcy53IH0gfSlcclxuICAgIC5lbGUoJ0B3JywgJ251bVByJylcclxuICAgIC5lbGUoJ0B3JywgJ2lsdmwnKVxyXG4gICAgLmF0dCgnQHcnLCAndmFsJywgU3RyaW5nKGxldmVsSWQpKVxyXG4gICAgLnVwKClcclxuICAgIC5lbGUoJ0B3JywgJ251bUlkJylcclxuICAgIC5hdHQoJ0B3JywgJ3ZhbCcsIFN0cmluZyhudW1iZXJpbmdJZCkpXHJcbiAgICAudXAoKVxyXG4gICAgLnVwKCk7XHJcblxyXG5jb25zdCBidWlsZE51bWJlcmluZ0luc3RhbmNlcyA9ICgpID0+XHJcbiAgZnJhZ21lbnQoeyBuYW1lc3BhY2VBbGlhczogeyB3OiBuYW1lc3BhY2VzLncgfSB9KVxyXG4gICAgLmVsZSgnQHcnLCAnbnVtJylcclxuICAgIC5lbGUoJ0B3JywgJ2Fic3RyYWN0TnVtSWQnKVxyXG4gICAgLnVwKClcclxuICAgIC51cCgpO1xyXG5cclxuY29uc3QgYnVpbGRTcGFjaW5nID0gKGxpbmVTcGFjaW5nLCBiZWZvcmVTcGFjaW5nLCBhZnRlclNwYWNpbmcpID0+IHtcclxuICBjb25zdCBzcGFjaW5nRnJhZ21lbnQgPSBmcmFnbWVudCh7IG5hbWVzcGFjZUFsaWFzOiB7IHc6IG5hbWVzcGFjZXMudyB9IH0pLmVsZSgnQHcnLCAnc3BhY2luZycpO1xyXG5cclxuICBpZiAobGluZVNwYWNpbmcpIHtcclxuICAgIHNwYWNpbmdGcmFnbWVudC5hdHQoJ0B3JywgJ2xpbmUnLCBsaW5lU3BhY2luZyk7XHJcbiAgfVxyXG4gIGlmIChiZWZvcmVTcGFjaW5nKSB7XHJcbiAgICBzcGFjaW5nRnJhZ21lbnQuYXR0KCdAdycsICdiZWZvcmUnLCBiZWZvcmVTcGFjaW5nKTtcclxuICB9XHJcbiAgaWYgKGFmdGVyU3BhY2luZykge1xyXG4gICAgc3BhY2luZ0ZyYWdtZW50LmF0dCgnQHcnLCAnYWZ0ZXInLCBhZnRlclNwYWNpbmcpO1xyXG4gIH1cclxuXHJcbiAgc3BhY2luZ0ZyYWdtZW50LmF0dCgnQHcnLCAnbGluZVJ1bGUnLCAnYXV0bycpLnVwKCk7XHJcblxyXG4gIHJldHVybiBzcGFjaW5nRnJhZ21lbnQ7XHJcbn07XHJcblxyXG5jb25zdCBidWlsZEluZGVudGF0aW9uID0gKHsgbGVmdCwgcmlnaHQgfSkgPT4ge1xyXG4gIGNvbnN0IGluZGVudGF0aW9uRnJhZ21lbnQgPSBmcmFnbWVudCh7XHJcbiAgICBuYW1lc3BhY2VBbGlhczogeyB3OiBuYW1lc3BhY2VzLncgfSxcclxuICB9KS5lbGUoJ0B3JywgJ2luZCcpO1xyXG5cclxuICBpZiAobGVmdCkge1xyXG4gICAgaW5kZW50YXRpb25GcmFnbWVudC5hdHQoJ0B3JywgJ2xlZnQnLCBsZWZ0KTtcclxuICB9XHJcbiAgaWYgKHJpZ2h0KSB7XHJcbiAgICBpbmRlbnRhdGlvbkZyYWdtZW50LmF0dCgnQHcnLCAncmlnaHQnLCByaWdodCk7XHJcbiAgfVxyXG5cclxuICBpbmRlbnRhdGlvbkZyYWdtZW50LnVwKCk7XHJcblxyXG4gIHJldHVybiBpbmRlbnRhdGlvbkZyYWdtZW50O1xyXG59O1xyXG5cclxuY29uc3QgYnVpbGRQU3R5bGUgPSAoc3R5bGUgPSAnTm9ybWFsJykgPT5cclxuICBmcmFnbWVudCh7IG5hbWVzcGFjZUFsaWFzOiB7IHc6IG5hbWVzcGFjZXMudyB9IH0pXHJcbiAgICAuZWxlKCdAdycsICdwU3R5bGUnKVxyXG4gICAgLmF0dCgnQHcnLCAndmFsJywgc3R5bGUpXHJcbiAgICAudXAoKTtcclxuXHJcbmNvbnN0IGJ1aWxkSG9yaXpvbnRhbEFsaWdubWVudCA9IChob3Jpem9udGFsQWxpZ25tZW50KSA9PiB7XHJcbiAgaWYgKGhvcml6b250YWxBbGlnbm1lbnQgPT09ICdqdXN0aWZ5Jykge1xyXG4gICAgaG9yaXpvbnRhbEFsaWdubWVudCA9ICdib3RoJztcclxuICB9XHJcbiAgcmV0dXJuIGZyYWdtZW50KHsgbmFtZXNwYWNlQWxpYXM6IHsgdzogbmFtZXNwYWNlcy53IH0gfSlcclxuICAgIC5lbGUoJ0B3JywgJ2pjJylcclxuICAgIC5hdHQoJ0B3JywgJ3ZhbCcsIGhvcml6b250YWxBbGlnbm1lbnQpXHJcbiAgICAudXAoKTtcclxufTtcclxuXHJcbmNvbnN0IGJ1aWxkUGFyYWdyYXBoQm9yZGVyID0gKCkgPT4ge1xyXG4gIGNvbnN0IHBhcmFncmFwaEJvcmRlckZyYWdtZW50ID0gZnJhZ21lbnQoeyBuYW1lc3BhY2VBbGlhczogeyB3OiBuYW1lc3BhY2VzLncgfSB9KS5lbGUoXHJcbiAgICAnQHcnLFxyXG4gICAgJ3BCZHInXHJcbiAgKTtcclxuICBjb25zdCBib3JkZXJzT2JqZWN0ID0gY2xvbmVEZWVwKHBhcmFncmFwaEJvcmRlcnNPYmplY3QpO1xyXG5cclxuICBPYmplY3Qua2V5cyhib3JkZXJzT2JqZWN0KS5mb3JFYWNoKChib3JkZXJOYW1lKSA9PiB7XHJcbiAgICBpZiAoYm9yZGVyc09iamVjdFtib3JkZXJOYW1lXSkge1xyXG4gICAgICBjb25zdCB7IHNpemUsIHNwYWNpbmcsIGNvbG9yIH0gPSBib3JkZXJzT2JqZWN0W2JvcmRlck5hbWVdO1xyXG5cclxuICAgICAgY29uc3QgYm9yZGVyRnJhZ21lbnQgPSBidWlsZEJvcmRlcihib3JkZXJOYW1lLCBzaXplLCBzcGFjaW5nLCBjb2xvcik7XHJcbiAgICAgIHBhcmFncmFwaEJvcmRlckZyYWdtZW50LmltcG9ydChib3JkZXJGcmFnbWVudCk7XHJcbiAgICB9XHJcbiAgfSk7XHJcblxyXG4gIHBhcmFncmFwaEJvcmRlckZyYWdtZW50LnVwKCk7XHJcblxyXG4gIHJldHVybiBwYXJhZ3JhcGhCb3JkZXJGcmFnbWVudDtcclxufTtcclxuXHJcbmNvbnN0IGJ1aWxkUGFyYWdyYXBoUHJvcGVydGllcyA9IChhdHRyaWJ1dGVzKSA9PiB7XHJcbiAgY29uc3QgcGFyYWdyYXBoUHJvcGVydGllc0ZyYWdtZW50ID0gZnJhZ21lbnQoeyBuYW1lc3BhY2VBbGlhczogeyB3OiBuYW1lc3BhY2VzLncgfSB9KS5lbGUoXHJcbiAgICAnQHcnLFxyXG4gICAgJ3BQcidcclxuICApO1xyXG4gIGlmIChhdHRyaWJ1dGVzICYmIGF0dHJpYnV0ZXMuY29uc3RydWN0b3IgPT09IE9iamVjdCkge1xyXG4gICAgT2JqZWN0LmtleXMoYXR0cmlidXRlcykuZm9yRWFjaCgoa2V5KSA9PiB7XHJcbiAgICAgIHN3aXRjaCAoa2V5KSB7XHJcbiAgICAgICAgY2FzZSAnbnVtYmVyaW5nJzpcclxuICAgICAgICAgIGNvbnN0IHsgbGV2ZWxJZCwgbnVtYmVyaW5nSWQgfSA9IGF0dHJpYnV0ZXNba2V5XTtcclxuICAgICAgICAgIGNvbnN0IG51bWJlcmluZ1Byb3BlcnRpZXNGcmFnbWVudCA9IGJ1aWxkTnVtYmVyaW5nUHJvcGVydGllcyhsZXZlbElkLCBudW1iZXJpbmdJZCk7XHJcbiAgICAgICAgICBwYXJhZ3JhcGhQcm9wZXJ0aWVzRnJhZ21lbnQuaW1wb3J0KG51bWJlcmluZ1Byb3BlcnRpZXNGcmFnbWVudCk7XHJcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cclxuICAgICAgICAgIGRlbGV0ZSBhdHRyaWJ1dGVzLm51bWJlcmluZztcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgJ3RleHRBbGlnbic6XHJcbiAgICAgICAgICBjb25zdCBob3Jpem9udGFsQWxpZ25tZW50RnJhZ21lbnQgPSBidWlsZEhvcml6b250YWxBbGlnbm1lbnQoYXR0cmlidXRlc1trZXldKTtcclxuICAgICAgICAgIHBhcmFncmFwaFByb3BlcnRpZXNGcmFnbWVudC5pbXBvcnQoaG9yaXpvbnRhbEFsaWdubWVudEZyYWdtZW50KTtcclxuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxyXG4gICAgICAgICAgZGVsZXRlIGF0dHJpYnV0ZXMudGV4dEFsaWduO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSAnYmFja2dyb3VuZENvbG9yJzpcclxuICAgICAgICAgIC8vIEFkZCBzaGFkaW5nIHRvIFBhcmFncmFwaCBQcm9wZXJ0aWVzIG9ubHkgaWYgZGlzcGxheSBpcyBibG9ja1xyXG4gICAgICAgICAgLy8gRXNzZW50aWFsbHkgaWYgYmFja2dyb3VuZCBjb2xvciBuZWVkcyB0byBiZSBhY3Jvc3MgdGhlIHJvd1xyXG4gICAgICAgICAgaWYgKGF0dHJpYnV0ZXMuZGlzcGxheSA9PT0gJ2Jsb2NrJykge1xyXG4gICAgICAgICAgICBjb25zdCBzaGFkaW5nRnJhZ21lbnQgPSBidWlsZFNoYWRpbmcoYXR0cmlidXRlc1trZXldKTtcclxuICAgICAgICAgICAgcGFyYWdyYXBoUHJvcGVydGllc0ZyYWdtZW50LmltcG9ydChzaGFkaW5nRnJhZ21lbnQpO1xyXG4gICAgICAgICAgICAvLyBGSVhNRTogSW5uZXIgcGFkZGluZyBpbiBjYXNlIG9mIHNoYWRlZCBwYXJhZ3JhcGhzLlxyXG4gICAgICAgICAgICBjb25zdCBwYXJhZ3JhcGhCb3JkZXJGcmFnbWVudCA9IGJ1aWxkUGFyYWdyYXBoQm9yZGVyKCk7XHJcbiAgICAgICAgICAgIHBhcmFncmFwaFByb3BlcnRpZXNGcmFnbWVudC5pbXBvcnQocGFyYWdyYXBoQm9yZGVyRnJhZ21lbnQpO1xyXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cclxuICAgICAgICAgICAgZGVsZXRlIGF0dHJpYnV0ZXMuYmFja2dyb3VuZENvbG9yO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSAncGFyYWdyYXBoU3R5bGUnOlxyXG4gICAgICAgICAgY29uc3QgcFN0eWxlRnJhZ21lbnQgPSBidWlsZFBTdHlsZShhdHRyaWJ1dGVzLnBhcmFncmFwaFN0eWxlKTtcclxuICAgICAgICAgIHBhcmFncmFwaFByb3BlcnRpZXNGcmFnbWVudC5pbXBvcnQocFN0eWxlRnJhZ21lbnQpO1xyXG4gICAgICAgICAgZGVsZXRlIGF0dHJpYnV0ZXMucGFyYWdyYXBoU3R5bGU7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlICdpbmRlbnRhdGlvbic6XHJcbiAgICAgICAgICBjb25zdCBpbmRlbnRhdGlvbkZyYWdtZW50ID0gYnVpbGRJbmRlbnRhdGlvbihhdHRyaWJ1dGVzW2tleV0pO1xyXG4gICAgICAgICAgcGFyYWdyYXBoUHJvcGVydGllc0ZyYWdtZW50LmltcG9ydChpbmRlbnRhdGlvbkZyYWdtZW50KTtcclxuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxyXG4gICAgICAgICAgZGVsZXRlIGF0dHJpYnV0ZXMuaW5kZW50YXRpb247XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3Qgc3BhY2luZ0ZyYWdtZW50ID0gYnVpbGRTcGFjaW5nKFxyXG4gICAgICBhdHRyaWJ1dGVzLmxpbmVIZWlnaHQsXHJcbiAgICAgIGF0dHJpYnV0ZXMuYmVmb3JlU3BhY2luZyxcclxuICAgICAgYXR0cmlidXRlcy5hZnRlclNwYWNpbmdcclxuICAgICk7XHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cclxuICAgIGRlbGV0ZSBhdHRyaWJ1dGVzLmxpbmVIZWlnaHQ7XHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cclxuICAgIGRlbGV0ZSBhdHRyaWJ1dGVzLmJlZm9yZVNwYWNpbmc7XHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cclxuICAgIGRlbGV0ZSBhdHRyaWJ1dGVzLmFmdGVyU3BhY2luZztcclxuXHJcbiAgICBwYXJhZ3JhcGhQcm9wZXJ0aWVzRnJhZ21lbnQuaW1wb3J0KHNwYWNpbmdGcmFnbWVudCk7XHJcbiAgfVxyXG4gIHBhcmFncmFwaFByb3BlcnRpZXNGcmFnbWVudC51cCgpO1xyXG5cclxuICByZXR1cm4gcGFyYWdyYXBoUHJvcGVydGllc0ZyYWdtZW50O1xyXG59O1xyXG5cclxuY29uc3QgY29tcHV0ZUltYWdlRGltZW5zaW9ucyA9ICh2Tm9kZSwgYXR0cmlidXRlcykgPT4ge1xyXG4gIGNvbnN0IHsgbWF4aW11bVdpZHRoLCBvcmlnaW5hbFdpZHRoLCBvcmlnaW5hbEhlaWdodCB9ID0gYXR0cmlidXRlcztcclxuICBjb25zdCBhc3BlY3RSYXRpbyA9IG9yaWdpbmFsV2lkdGggLyBvcmlnaW5hbEhlaWdodDtcclxuICBjb25zdCBtYXhpbXVtV2lkdGhJbkVNVSA9IFRXSVBUb0VNVShtYXhpbXVtV2lkdGgpO1xyXG4gIGxldCBvcmlnaW5hbFdpZHRoSW5FTVUgPSBwaXhlbFRvRU1VKG9yaWdpbmFsV2lkdGgpO1xyXG4gIGxldCBvcmlnaW5hbEhlaWdodEluRU1VID0gcGl4ZWxUb0VNVShvcmlnaW5hbEhlaWdodCk7XHJcbiAgaWYgKG9yaWdpbmFsV2lkdGhJbkVNVSA+IG1heGltdW1XaWR0aEluRU1VKSB7XHJcbiAgICBvcmlnaW5hbFdpZHRoSW5FTVUgPSBtYXhpbXVtV2lkdGhJbkVNVTtcclxuICAgIG9yaWdpbmFsSGVpZ2h0SW5FTVUgPSBNYXRoLnJvdW5kKG9yaWdpbmFsV2lkdGhJbkVNVSAvIGFzcGVjdFJhdGlvKTtcclxuICB9XHJcbiAgbGV0IG1vZGlmaWVkSGVpZ2h0O1xyXG4gIGxldCBtb2RpZmllZFdpZHRoO1xyXG5cclxuICBpZiAodk5vZGUucHJvcGVydGllcyAmJiB2Tm9kZS5wcm9wZXJ0aWVzLnN0eWxlKSB7XHJcbiAgICBpZiAodk5vZGUucHJvcGVydGllcy5zdHlsZS53aWR0aCkge1xyXG4gICAgICBpZiAodk5vZGUucHJvcGVydGllcy5zdHlsZS53aWR0aCAhPT0gJ2F1dG8nKSB7XHJcbiAgICAgICAgaWYgKHBpeGVsUmVnZXgudGVzdCh2Tm9kZS5wcm9wZXJ0aWVzLnN0eWxlLndpZHRoKSkge1xyXG4gICAgICAgICAgbW9kaWZpZWRXaWR0aCA9IHBpeGVsVG9FTVUodk5vZGUucHJvcGVydGllcy5zdHlsZS53aWR0aC5tYXRjaChwaXhlbFJlZ2V4KVsxXSk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChwZXJjZW50YWdlUmVnZXgudGVzdCh2Tm9kZS5wcm9wZXJ0aWVzLnN0eWxlLndpZHRoKSkge1xyXG4gICAgICAgICAgY29uc3QgcGVyY2VudGFnZVZhbHVlID0gdk5vZGUucHJvcGVydGllcy5zdHlsZS53aWR0aC5tYXRjaChwZXJjZW50YWdlUmVnZXgpWzFdO1xyXG5cclxuICAgICAgICAgIG1vZGlmaWVkV2lkdGggPSBNYXRoLnJvdW5kKChwZXJjZW50YWdlVmFsdWUgLyAxMDApICogb3JpZ2luYWxXaWR0aEluRU1VKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWxvbmVseS1pZlxyXG4gICAgICAgIGlmICh2Tm9kZS5wcm9wZXJ0aWVzLnN0eWxlLmhlaWdodCAmJiB2Tm9kZS5wcm9wZXJ0aWVzLnN0eWxlLmhlaWdodCA9PT0gJ2F1dG8nKSB7XHJcbiAgICAgICAgICBtb2RpZmllZFdpZHRoID0gb3JpZ2luYWxXaWR0aEluRU1VO1xyXG4gICAgICAgICAgbW9kaWZpZWRIZWlnaHQgPSBvcmlnaW5hbEhlaWdodEluRU1VO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKHZOb2RlLnByb3BlcnRpZXMuc3R5bGUuaGVpZ2h0KSB7XHJcbiAgICAgIGlmICh2Tm9kZS5wcm9wZXJ0aWVzLnN0eWxlLmhlaWdodCAhPT0gJ2F1dG8nKSB7XHJcbiAgICAgICAgaWYgKHBpeGVsUmVnZXgudGVzdCh2Tm9kZS5wcm9wZXJ0aWVzLnN0eWxlLmhlaWdodCkpIHtcclxuICAgICAgICAgIG1vZGlmaWVkSGVpZ2h0ID0gcGl4ZWxUb0VNVSh2Tm9kZS5wcm9wZXJ0aWVzLnN0eWxlLmhlaWdodC5tYXRjaChwaXhlbFJlZ2V4KVsxXSk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChwZXJjZW50YWdlUmVnZXgudGVzdCh2Tm9kZS5wcm9wZXJ0aWVzLnN0eWxlLmhlaWdodCkpIHtcclxuICAgICAgICAgIGNvbnN0IHBlcmNlbnRhZ2VWYWx1ZSA9IHZOb2RlLnByb3BlcnRpZXMuc3R5bGUud2lkdGgubWF0Y2gocGVyY2VudGFnZVJlZ2V4KVsxXTtcclxuXHJcbiAgICAgICAgICBtb2RpZmllZEhlaWdodCA9IE1hdGgucm91bmQoKHBlcmNlbnRhZ2VWYWx1ZSAvIDEwMCkgKiBvcmlnaW5hbEhlaWdodEluRU1VKTtcclxuICAgICAgICAgIGlmICghbW9kaWZpZWRXaWR0aCkge1xyXG4gICAgICAgICAgICBtb2RpZmllZFdpZHRoID0gTWF0aC5yb3VuZChtb2RpZmllZEhlaWdodCAqIGFzcGVjdFJhdGlvKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWxvbmVseS1pZlxyXG4gICAgICAgIGlmIChtb2RpZmllZFdpZHRoKSB7XHJcbiAgICAgICAgICBpZiAoIW1vZGlmaWVkSGVpZ2h0KSB7XHJcbiAgICAgICAgICAgIG1vZGlmaWVkSGVpZ2h0ID0gTWF0aC5yb3VuZChtb2RpZmllZFdpZHRoIC8gYXNwZWN0UmF0aW8pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBtb2RpZmllZEhlaWdodCA9IG9yaWdpbmFsSGVpZ2h0SW5FTVU7XHJcbiAgICAgICAgICBtb2RpZmllZFdpZHRoID0gb3JpZ2luYWxXaWR0aEluRU1VO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKG1vZGlmaWVkV2lkdGggJiYgIW1vZGlmaWVkSGVpZ2h0KSB7XHJcbiAgICAgIG1vZGlmaWVkSGVpZ2h0ID0gTWF0aC5yb3VuZChtb2RpZmllZFdpZHRoIC8gYXNwZWN0UmF0aW8pO1xyXG4gICAgfSBlbHNlIGlmIChtb2RpZmllZEhlaWdodCAmJiAhbW9kaWZpZWRXaWR0aCkge1xyXG4gICAgICBtb2RpZmllZFdpZHRoID0gTWF0aC5yb3VuZChtb2RpZmllZEhlaWdodCAqIGFzcGVjdFJhdGlvKTtcclxuICAgIH1cclxuICB9IGVsc2Uge1xyXG4gICAgbW9kaWZpZWRXaWR0aCA9IG9yaWdpbmFsV2lkdGhJbkVNVTtcclxuICAgIG1vZGlmaWVkSGVpZ2h0ID0gb3JpZ2luYWxIZWlnaHRJbkVNVTtcclxuICB9XHJcblxyXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxyXG4gIGF0dHJpYnV0ZXMud2lkdGggPSBtb2RpZmllZFdpZHRoO1xyXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxyXG4gIGF0dHJpYnV0ZXMuaGVpZ2h0ID0gbW9kaWZpZWRIZWlnaHQ7XHJcbn07XHJcblxyXG5jb25zdCBidWlsZFBhcmFncmFwaCA9IGFzeW5jICh2Tm9kZSwgYXR0cmlidXRlcywgZG9jeERvY3VtZW50SW5zdGFuY2UpID0+IHtcclxuICBjb25zdCBwYXJhZ3JhcGhGcmFnbWVudCA9IGZyYWdtZW50KHsgbmFtZXNwYWNlQWxpYXM6IHsgdzogbmFtZXNwYWNlcy53IH0gfSkuZWxlKCdAdycsICdwJyk7XHJcbiAgY29uc3QgbW9kaWZpZWRBdHRyaWJ1dGVzID0gbW9kaWZpZWRTdHlsZUF0dHJpYnV0ZXNCdWlsZGVyKHZOb2RlLCBhdHRyaWJ1dGVzLCB7XHJcbiAgICBpc1BhcmFncmFwaDogdHJ1ZSxcclxuICB9KTtcclxuICBjb25zdCBwYXJhZ3JhcGhQcm9wZXJ0aWVzRnJhZ21lbnQgPSBidWlsZFBhcmFncmFwaFByb3BlcnRpZXMobW9kaWZpZWRBdHRyaWJ1dGVzKTtcclxuICBwYXJhZ3JhcGhGcmFnbWVudC5pbXBvcnQocGFyYWdyYXBoUHJvcGVydGllc0ZyYWdtZW50KTtcclxuICBpZiAoaXNWTm9kZSh2Tm9kZSkgJiYgdk5vZGVIYXNDaGlsZHJlbih2Tm9kZSkpIHtcclxuICAgIGlmIChcclxuICAgICAgW1xyXG4gICAgICAgICdzcGFuJyxcclxuICAgICAgICAnc3Ryb25nJyxcclxuICAgICAgICAnYicsXHJcbiAgICAgICAgJ2VtJyxcclxuICAgICAgICAnaScsXHJcbiAgICAgICAgJ3UnLFxyXG4gICAgICAgICdpbnMnLFxyXG4gICAgICAgICdzdHJpa2UnLFxyXG4gICAgICAgICdkZWwnLFxyXG4gICAgICAgICdzJyxcclxuICAgICAgICAnc3ViJyxcclxuICAgICAgICAnc3VwJyxcclxuICAgICAgICAnbWFyaycsXHJcbiAgICAgICAgJ2EnLFxyXG4gICAgICAgICdjb2RlJyxcclxuICAgICAgICAncHJlJyxcclxuICAgICAgXS5pbmNsdWRlcyh2Tm9kZS50YWdOYW1lKVxyXG4gICAgKSB7XHJcbiAgICAgIGNvbnN0IHJ1bk9ySHlwZXJsaW5rRnJhZ21lbnRzID0gYXdhaXQgYnVpbGRSdW5Pckh5cGVyTGluayhcclxuICAgICAgICB2Tm9kZSxcclxuICAgICAgICBtb2RpZmllZEF0dHJpYnV0ZXMsXHJcbiAgICAgICAgZG9jeERvY3VtZW50SW5zdGFuY2VcclxuICAgICAgKTtcclxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkocnVuT3JIeXBlcmxpbmtGcmFnbWVudHMpKSB7XHJcbiAgICAgICAgZm9yIChcclxuICAgICAgICAgIGxldCBpdGVyYXRvckluZGV4ID0gMDtcclxuICAgICAgICAgIGl0ZXJhdG9ySW5kZXggPCBydW5Pckh5cGVybGlua0ZyYWdtZW50cy5sZW5ndGg7XHJcbiAgICAgICAgICBpdGVyYXRvckluZGV4KytcclxuICAgICAgICApIHtcclxuICAgICAgICAgIGNvbnN0IHJ1bk9ySHlwZXJsaW5rRnJhZ21lbnQgPSBydW5Pckh5cGVybGlua0ZyYWdtZW50c1tpdGVyYXRvckluZGV4XTtcclxuXHJcbiAgICAgICAgICBwYXJhZ3JhcGhGcmFnbWVudC5pbXBvcnQocnVuT3JIeXBlcmxpbmtGcmFnbWVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHBhcmFncmFwaEZyYWdtZW50LmltcG9ydChydW5Pckh5cGVybGlua0ZyYWdtZW50cyk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSBpZiAodk5vZGUudGFnTmFtZSA9PT0gJ2Jsb2NrcXVvdGUnKSB7XHJcbiAgICAgIGNvbnN0IHJ1bkZyYWdtZW50T3JGcmFnbWVudHMgPSBhd2FpdCBidWlsZFJ1bih2Tm9kZSwgYXR0cmlidXRlcyk7XHJcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHJ1bkZyYWdtZW50T3JGcmFnbWVudHMpKSB7XHJcbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHJ1bkZyYWdtZW50T3JGcmFnbWVudHMubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgICAgICBwYXJhZ3JhcGhGcmFnbWVudC5pbXBvcnQocnVuRnJhZ21lbnRPckZyYWdtZW50c1tpbmRleF0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBwYXJhZ3JhcGhGcmFnbWVudC5pbXBvcnQocnVuRnJhZ21lbnRPckZyYWdtZW50cyk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB2Tm9kZS5jaGlsZHJlbi5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgICBjb25zdCBjaGlsZFZOb2RlID0gdk5vZGUuY2hpbGRyZW5baW5kZXhdO1xyXG4gICAgICAgIGlmIChjaGlsZFZOb2RlLnRhZ05hbWUgPT09ICdpbWcnKSB7XHJcbiAgICAgICAgICBsZXQgYmFzZTY0U3RyaW5nO1xyXG4gICAgICAgICAgY29uc3QgaW1hZ2VTb3VyY2UgPSBjaGlsZFZOb2RlLnByb3BlcnRpZXMuc3JjO1xyXG4gICAgICAgICAgaWYgKGlzVmFsaWRVcmwoaW1hZ2VTb3VyY2UpKSB7XHJcbiAgICAgICAgICAgIGJhc2U2NFN0cmluZyA9IGF3YWl0IGltYWdlVG9CYXNlNjQoaW1hZ2VTb3VyY2UpLmNhdGNoKChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXHJcbiAgICAgICAgICAgICAgY29uc29sZS53YXJuaW5nKGBza2lwcGluZyBpbWFnZSBkb3dubG9hZCBhbmQgY29udmVyc2lvbiBkdWUgdG8gJHtlcnJvcn1gKTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBpZiAoYmFzZTY0U3RyaW5nICYmIG1pbWVUeXBlcy5sb29rdXAoaW1hZ2VTb3VyY2UpKSB7XHJcbiAgICAgICAgICAgICAgY2hpbGRWTm9kZS5wcm9wZXJ0aWVzLnNyYyA9IGBkYXRhOiR7bWltZVR5cGVzLmxvb2t1cChcclxuICAgICAgICAgICAgICAgIGltYWdlU291cmNlXHJcbiAgICAgICAgICAgICAgKX07YmFzZTY0LCAke2Jhc2U2NFN0cmluZ31gO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlbGVzcy1lc2NhcGUsIHByZWZlci1kZXN0cnVjdHVyaW5nXHJcbiAgICAgICAgICAgIGJhc2U2NFN0cmluZyA9IGltYWdlU291cmNlLm1hdGNoKC9eZGF0YTooW0EtWmEtei0rXFwvXSspO2Jhc2U2NCwoLispJC8pWzJdO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgY29uc3QgaW1hZ2VCdWZmZXIgPSBCdWZmZXIuZnJvbShkZWNvZGVVUklDb21wb25lbnQoYmFzZTY0U3RyaW5nKSwgJ2Jhc2U2NCcpO1xyXG4gICAgICAgICAgY29uc3QgaW1hZ2VQcm9wZXJ0aWVzID0gc2l6ZU9mKGltYWdlQnVmZmVyKTtcclxuXHJcbiAgICAgICAgICBtb2RpZmllZEF0dHJpYnV0ZXMubWF4aW11bVdpZHRoID1cclxuICAgICAgICAgICAgbW9kaWZpZWRBdHRyaWJ1dGVzLm1heGltdW1XaWR0aCB8fCBkb2N4RG9jdW1lbnRJbnN0YW5jZS5hdmFpbGFibGVEb2N1bWVudFNwYWNlO1xyXG4gICAgICAgICAgbW9kaWZpZWRBdHRyaWJ1dGVzLm9yaWdpbmFsV2lkdGggPSBpbWFnZVByb3BlcnRpZXMud2lkdGg7XHJcbiAgICAgICAgICBtb2RpZmllZEF0dHJpYnV0ZXMub3JpZ2luYWxIZWlnaHQgPSBpbWFnZVByb3BlcnRpZXMuaGVpZ2h0O1xyXG5cclxuICAgICAgICAgIGNvbXB1dGVJbWFnZURpbWVuc2lvbnMoY2hpbGRWTm9kZSwgbW9kaWZpZWRBdHRyaWJ1dGVzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgcnVuT3JIeXBlcmxpbmtGcmFnbWVudHMgPSBhd2FpdCBidWlsZFJ1bk9ySHlwZXJMaW5rKFxyXG4gICAgICAgICAgY2hpbGRWTm9kZSxcclxuICAgICAgICAgIGlzVk5vZGUoY2hpbGRWTm9kZSkgJiYgY2hpbGRWTm9kZS50YWdOYW1lID09PSAnaW1nJ1xyXG4gICAgICAgICAgICA/IHsgLi4ubW9kaWZpZWRBdHRyaWJ1dGVzLCB0eXBlOiAncGljdHVyZScgfVxyXG4gICAgICAgICAgICA6IG1vZGlmaWVkQXR0cmlidXRlcyxcclxuICAgICAgICAgIGRvY3hEb2N1bWVudEluc3RhbmNlXHJcbiAgICAgICAgKTtcclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShydW5Pckh5cGVybGlua0ZyYWdtZW50cykpIHtcclxuICAgICAgICAgIGZvciAoXHJcbiAgICAgICAgICAgIGxldCBpdGVyYXRvckluZGV4ID0gMDtcclxuICAgICAgICAgICAgaXRlcmF0b3JJbmRleCA8IHJ1bk9ySHlwZXJsaW5rRnJhZ21lbnRzLmxlbmd0aDtcclxuICAgICAgICAgICAgaXRlcmF0b3JJbmRleCsrXHJcbiAgICAgICAgICApIHtcclxuICAgICAgICAgICAgY29uc3QgcnVuT3JIeXBlcmxpbmtGcmFnbWVudCA9IHJ1bk9ySHlwZXJsaW5rRnJhZ21lbnRzW2l0ZXJhdG9ySW5kZXhdO1xyXG5cclxuICAgICAgICAgICAgcGFyYWdyYXBoRnJhZ21lbnQuaW1wb3J0KHJ1bk9ySHlwZXJsaW5rRnJhZ21lbnQpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBwYXJhZ3JhcGhGcmFnbWVudC5pbXBvcnQocnVuT3JIeXBlcmxpbmtGcmFnbWVudHMpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH0gZWxzZSB7XHJcbiAgICAvLyBJbiBjYXNlIHBhcmFncmFwaHMgaGFzIHRvIGJlIHJlbmRlcmVkIHdoZXJlIHZUZXh0IGlzIHByZXNlbnQuIEVnLiB0YWJsZS1jZWxsXHJcbiAgICAvLyBPciBpbiBjYXNlIHRoZSB2Tm9kZSBpcyBzb21ldGhpbmcgbGlrZSBpbWdcclxuICAgIGlmIChpc1ZOb2RlKHZOb2RlKSAmJiB2Tm9kZS50YWdOYW1lID09PSAnaW1nJykge1xyXG4gICAgICBjb25zdCBpbWFnZVNvdXJjZSA9IHZOb2RlLnByb3BlcnRpZXMuc3JjO1xyXG4gICAgICBsZXQgYmFzZTY0U3RyaW5nID0gaW1hZ2VTb3VyY2U7XHJcbiAgICAgIGlmIChpc1ZhbGlkVXJsKGltYWdlU291cmNlKSkge1xyXG4gICAgICAgIGJhc2U2NFN0cmluZyA9IGF3YWl0IGltYWdlVG9CYXNlNjQoaW1hZ2VTb3VyY2UpLmNhdGNoKChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcclxuICAgICAgICAgIGNvbnNvbGUud2FybmluZyhgc2tpcHBpbmcgaW1hZ2UgZG93bmxvYWQgYW5kIGNvbnZlcnNpb24gZHVlIHRvICR7ZXJyb3J9YCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGlmIChiYXNlNjRTdHJpbmcgJiYgbWltZVR5cGVzLmxvb2t1cChpbWFnZVNvdXJjZSkpIHtcclxuICAgICAgICAgIHZOb2RlLnByb3BlcnRpZXMuc3JjID0gYGRhdGE6JHttaW1lVHlwZXMubG9va3VwKGltYWdlU291cmNlKX07YmFzZTY0LCAke2Jhc2U2NFN0cmluZ31gO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBwYXJhZ3JhcGhGcmFnbWVudC51cCgpO1xyXG5cclxuICAgICAgICAgIHJldHVybiBwYXJhZ3JhcGhGcmFnbWVudDtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZWxlc3MtZXNjYXBlLCBwcmVmZXItZGVzdHJ1Y3R1cmluZ1xyXG4gICAgICAgIGJhc2U2NFN0cmluZyA9IGJhc2U2NFN0cmluZy5tYXRjaCgvXmRhdGE6KFtBLVphLXotK1xcL10rKTtiYXNlNjQsKC4rKSQvKVsyXTtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgaW1hZ2VCdWZmZXIgPSBCdWZmZXIuZnJvbShkZWNvZGVVUklDb21wb25lbnQoYmFzZTY0U3RyaW5nKSwgJ2Jhc2U2NCcpO1xyXG4gICAgICBjb25zdCBpbWFnZVByb3BlcnRpZXMgPSBzaXplT2YoaW1hZ2VCdWZmZXIpO1xyXG5cclxuICAgICAgbW9kaWZpZWRBdHRyaWJ1dGVzLm1heGltdW1XaWR0aCA9XHJcbiAgICAgICAgbW9kaWZpZWRBdHRyaWJ1dGVzLm1heGltdW1XaWR0aCB8fCBkb2N4RG9jdW1lbnRJbnN0YW5jZS5hdmFpbGFibGVEb2N1bWVudFNwYWNlO1xyXG4gICAgICBtb2RpZmllZEF0dHJpYnV0ZXMub3JpZ2luYWxXaWR0aCA9IGltYWdlUHJvcGVydGllcy53aWR0aDtcclxuICAgICAgbW9kaWZpZWRBdHRyaWJ1dGVzLm9yaWdpbmFsSGVpZ2h0ID0gaW1hZ2VQcm9wZXJ0aWVzLmhlaWdodDtcclxuXHJcbiAgICAgIGNvbXB1dGVJbWFnZURpbWVuc2lvbnModk5vZGUsIG1vZGlmaWVkQXR0cmlidXRlcyk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBydW5GcmFnbWVudHMgPSBhd2FpdCBidWlsZFJ1bk9yUnVucyh2Tm9kZSwgbW9kaWZpZWRBdHRyaWJ1dGVzLCBkb2N4RG9jdW1lbnRJbnN0YW5jZSk7XHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheShydW5GcmFnbWVudHMpKSB7XHJcbiAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBydW5GcmFnbWVudHMubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgICAgY29uc3QgcnVuRnJhZ21lbnQgPSBydW5GcmFnbWVudHNbaW5kZXhdO1xyXG5cclxuICAgICAgICBwYXJhZ3JhcGhGcmFnbWVudC5pbXBvcnQocnVuRnJhZ21lbnQpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBwYXJhZ3JhcGhGcmFnbWVudC5pbXBvcnQocnVuRnJhZ21lbnRzKTtcclxuICAgIH1cclxuICB9XHJcbiAgcGFyYWdyYXBoRnJhZ21lbnQudXAoKTtcclxuXHJcbiAgcmV0dXJuIHBhcmFncmFwaEZyYWdtZW50O1xyXG59O1xyXG5cclxuY29uc3QgYnVpbGRHcmlkU3BhbkZyYWdtZW50ID0gKHNwYW5WYWx1ZSkgPT5cclxuICBmcmFnbWVudCh7IG5hbWVzcGFjZUFsaWFzOiB7IHc6IG5hbWVzcGFjZXMudyB9IH0pXHJcbiAgICAuZWxlKCdAdycsICdncmlkU3BhbicpXHJcbiAgICAuYXR0KCdAdycsICd2YWwnLCBzcGFuVmFsdWUpXHJcbiAgICAudXAoKTtcclxuXHJcbmNvbnN0IGJ1aWxkVGFibGVDZWxsU3BhY2luZyA9IChjZWxsU3BhY2luZyA9IDApID0+XHJcbiAgZnJhZ21lbnQoeyBuYW1lc3BhY2VBbGlhczogeyB3OiBuYW1lc3BhY2VzLncgfSB9KVxyXG4gICAgLmVsZSgnQHcnLCAndGJsQ2VsbFNwYWNpbmcnKVxyXG4gICAgLmF0dCgnQHcnLCAndycsIGNlbGxTcGFjaW5nKVxyXG4gICAgLmF0dCgnQHcnLCAndHlwZScsICdkeGEnKVxyXG4gICAgLnVwKCk7XHJcblxyXG5jb25zdCBidWlsZFRhYmxlQ2VsbEJvcmRlcnMgPSAodGFibGVDZWxsQm9yZGVyKSA9PiB7XHJcbiAgY29uc3QgdGFibGVDZWxsQm9yZGVyc0ZyYWdtZW50ID0gZnJhZ21lbnQoeyBuYW1lc3BhY2VBbGlhczogeyB3OiBuYW1lc3BhY2VzLncgfSB9KS5lbGUoXHJcbiAgICAnQHcnLFxyXG4gICAgJ3RjQm9yZGVycydcclxuICApO1xyXG5cclxuICBjb25zdCB7IGNvbG9yLCBzdHJva2UsIC4uLmJvcmRlcnMgfSA9IHRhYmxlQ2VsbEJvcmRlcjtcclxuICBPYmplY3Qua2V5cyhib3JkZXJzKS5mb3JFYWNoKChib3JkZXIpID0+IHtcclxuICAgIGlmICh0YWJsZUNlbGxCb3JkZXJbYm9yZGVyXSkge1xyXG4gICAgICBjb25zdCBib3JkZXJGcmFnbWVudCA9IGJ1aWxkQm9yZGVyKGJvcmRlciwgdGFibGVDZWxsQm9yZGVyW2JvcmRlcl0sIDAsIGNvbG9yLCBzdHJva2UpO1xyXG4gICAgICB0YWJsZUNlbGxCb3JkZXJzRnJhZ21lbnQuaW1wb3J0KGJvcmRlckZyYWdtZW50KTtcclxuICAgIH1cclxuICB9KTtcclxuXHJcbiAgdGFibGVDZWxsQm9yZGVyc0ZyYWdtZW50LnVwKCk7XHJcblxyXG4gIHJldHVybiB0YWJsZUNlbGxCb3JkZXJzRnJhZ21lbnQ7XHJcbn07XHJcblxyXG5jb25zdCBidWlsZFRhYmxlQ2VsbFdpZHRoID0gKHRhYmxlQ2VsbFdpZHRoKSA9PlxyXG4gIGZyYWdtZW50KHsgbmFtZXNwYWNlQWxpYXM6IHsgdzogbmFtZXNwYWNlcy53IH0gfSlcclxuICAgIC5lbGUoJ0B3JywgJ3RjVycpXHJcbiAgICAuYXR0KCdAdycsICd3JywgZml4dXBDb2x1bW5XaWR0aCh0YWJsZUNlbGxXaWR0aCkpXHJcbiAgICAuYXR0KCdAdycsICd0eXBlJywgJ2R4YScpXHJcbiAgICAudXAoKTtcclxuXHJcbmNvbnN0IGJ1aWxkVGFibGVDZWxsUHJvcGVydGllcyA9IChhdHRyaWJ1dGVzKSA9PiB7XHJcbiAgY29uc3QgdGFibGVDZWxsUHJvcGVydGllc0ZyYWdtZW50ID0gZnJhZ21lbnQoeyBuYW1lc3BhY2VBbGlhczogeyB3OiBuYW1lc3BhY2VzLncgfSB9KS5lbGUoXHJcbiAgICAnQHcnLFxyXG4gICAgJ3RjUHInXHJcbiAgKTtcclxuICBpZiAoYXR0cmlidXRlcyAmJiBhdHRyaWJ1dGVzLmNvbnN0cnVjdG9yID09PSBPYmplY3QpIHtcclxuICAgIE9iamVjdC5rZXlzKGF0dHJpYnV0ZXMpLmZvckVhY2goKGtleSkgPT4ge1xyXG4gICAgICBzd2l0Y2ggKGtleSkge1xyXG4gICAgICAgIGNhc2UgJ2JhY2tncm91bmRDb2xvcic6XHJcbiAgICAgICAgICBjb25zdCBzaGFkaW5nRnJhZ21lbnQgPSBidWlsZFNoYWRpbmcoYXR0cmlidXRlc1trZXldKTtcclxuICAgICAgICAgIHRhYmxlQ2VsbFByb3BlcnRpZXNGcmFnbWVudC5pbXBvcnQoc2hhZGluZ0ZyYWdtZW50KTtcclxuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxyXG4gICAgICAgICAgZGVsZXRlIGF0dHJpYnV0ZXMuYmFja2dyb3VuZENvbG9yO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSAndmVydGljYWxBbGlnbic6XHJcbiAgICAgICAgICBjb25zdCB2ZXJ0aWNhbEFsaWdubWVudEZyYWdtZW50ID0gYnVpbGRWZXJ0aWNhbEFsaWdubWVudChhdHRyaWJ1dGVzW2tleV0pO1xyXG4gICAgICAgICAgdGFibGVDZWxsUHJvcGVydGllc0ZyYWdtZW50LmltcG9ydCh2ZXJ0aWNhbEFsaWdubWVudEZyYWdtZW50KTtcclxuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxyXG4gICAgICAgICAgZGVsZXRlIGF0dHJpYnV0ZXMudmVydGljYWxBbGlnbjtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgJ2NvbFNwYW4nOlxyXG4gICAgICAgICAgY29uc3QgZ3JpZFNwYW5GcmFnbWVudCA9IGJ1aWxkR3JpZFNwYW5GcmFnbWVudChhdHRyaWJ1dGVzW2tleV0pO1xyXG4gICAgICAgICAgdGFibGVDZWxsUHJvcGVydGllc0ZyYWdtZW50LmltcG9ydChncmlkU3BhbkZyYWdtZW50KTtcclxuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxyXG4gICAgICAgICAgZGVsZXRlIGF0dHJpYnV0ZXMuY29sU3BhbjtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgJ3RhYmxlQ2VsbEJvcmRlcic6XHJcbiAgICAgICAgICBjb25zdCB0YWJsZUNlbGxCb3JkZXJGcmFnbWVudCA9IGJ1aWxkVGFibGVDZWxsQm9yZGVycyhhdHRyaWJ1dGVzW2tleV0pO1xyXG4gICAgICAgICAgdGFibGVDZWxsUHJvcGVydGllc0ZyYWdtZW50LmltcG9ydCh0YWJsZUNlbGxCb3JkZXJGcmFnbWVudCk7XHJcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cclxuICAgICAgICAgIGRlbGV0ZSBhdHRyaWJ1dGVzLnRhYmxlQ2VsbEJvcmRlcjtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgJ3Jvd1NwYW4nOlxyXG4gICAgICAgICAgY29uc3QgdmVydGljYWxNZXJnZUZyYWdtZW50ID0gYnVpbGRWZXJ0aWNhbE1lcmdlKGF0dHJpYnV0ZXNba2V5XSk7XHJcbiAgICAgICAgICB0YWJsZUNlbGxQcm9wZXJ0aWVzRnJhZ21lbnQuaW1wb3J0KHZlcnRpY2FsTWVyZ2VGcmFnbWVudCk7XHJcblxyXG4gICAgICAgICAgZGVsZXRlIGF0dHJpYnV0ZXMucm93U3BhbjtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgJ3dpZHRoJzpcclxuICAgICAgICAgIGNvbnN0IHdpZHRoRnJhZ21lbnQgPSBidWlsZFRhYmxlQ2VsbFdpZHRoKGF0dHJpYnV0ZXNba2V5XSk7XHJcbiAgICAgICAgICB0YWJsZUNlbGxQcm9wZXJ0aWVzRnJhZ21lbnQuaW1wb3J0KHdpZHRoRnJhZ21lbnQpO1xyXG4gICAgICAgICAgZGVsZXRlIGF0dHJpYnV0ZXMud2lkdGg7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG4gIHRhYmxlQ2VsbFByb3BlcnRpZXNGcmFnbWVudC51cCgpO1xyXG5cclxuICByZXR1cm4gdGFibGVDZWxsUHJvcGVydGllc0ZyYWdtZW50O1xyXG59O1xyXG5cclxuY29uc3QgZml4dXBUYWJsZUNlbGxCb3JkZXIgPSAodk5vZGUsIGF0dHJpYnV0ZXMpID0+IHtcclxuICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHZOb2RlLnByb3BlcnRpZXMuc3R5bGUsICdib3JkZXInKSkge1xyXG4gICAgaWYgKHZOb2RlLnByb3BlcnRpZXMuc3R5bGUuYm9yZGVyID09PSAnbm9uZScgfHwgdk5vZGUucHJvcGVydGllcy5zdHlsZS5ib3JkZXIgPT09IDApIHtcclxuICAgICAgYXR0cmlidXRlcy50YWJsZUNlbGxCb3JkZXIgPSB7fTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZVxyXG4gICAgICBjb25zdCBbYm9yZGVyU2l6ZSwgYm9yZGVyU3Ryb2tlLCBib3JkZXJDb2xvcl0gPSBjc3NCb3JkZXJQYXJzZXIoXHJcbiAgICAgICAgdk5vZGUucHJvcGVydGllcy5zdHlsZS5ib3JkZXJcclxuICAgICAgKTtcclxuXHJcbiAgICAgIGF0dHJpYnV0ZXMudGFibGVDZWxsQm9yZGVyID0ge1xyXG4gICAgICAgIHRvcDogYm9yZGVyU2l6ZSxcclxuICAgICAgICBsZWZ0OiBib3JkZXJTaXplLFxyXG4gICAgICAgIGJvdHRvbTogYm9yZGVyU2l6ZSxcclxuICAgICAgICByaWdodDogYm9yZGVyU2l6ZSxcclxuICAgICAgICBjb2xvcjogYm9yZGVyQ29sb3IsXHJcbiAgICAgICAgc3Ryb2tlOiBib3JkZXJTdHJva2UsXHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgfVxyXG4gIGlmICh2Tm9kZS5wcm9wZXJ0aWVzLnN0eWxlWydib3JkZXItdG9wJ10gJiYgdk5vZGUucHJvcGVydGllcy5zdHlsZVsnYm9yZGVyLXRvcCddID09PSAnMCcpIHtcclxuICAgIGF0dHJpYnV0ZXMudGFibGVDZWxsQm9yZGVyID0ge1xyXG4gICAgICAuLi5hdHRyaWJ1dGVzLnRhYmxlQ2VsbEJvcmRlcixcclxuICAgICAgdG9wOiAwLFxyXG4gICAgfTtcclxuICB9IGVsc2UgaWYgKHZOb2RlLnByb3BlcnRpZXMuc3R5bGVbJ2JvcmRlci10b3AnXSAmJiB2Tm9kZS5wcm9wZXJ0aWVzLnN0eWxlWydib3JkZXItdG9wJ10gIT09ICcwJykge1xyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lXHJcbiAgICBjb25zdCBbYm9yZGVyU2l6ZSwgYm9yZGVyU3Ryb2tlLCBib3JkZXJDb2xvcl0gPSBjc3NCb3JkZXJQYXJzZXIoXHJcbiAgICAgIHZOb2RlLnByb3BlcnRpZXMuc3R5bGVbJ2JvcmRlci10b3AnXVxyXG4gICAgKTtcclxuICAgIGF0dHJpYnV0ZXMudGFibGVDZWxsQm9yZGVyID0ge1xyXG4gICAgICAuLi5hdHRyaWJ1dGVzLnRhYmxlQ2VsbEJvcmRlcixcclxuICAgICAgdG9wOiBib3JkZXJTaXplLFxyXG4gICAgICBjb2xvcjogYm9yZGVyQ29sb3IsXHJcbiAgICAgIHN0cm9rZTogYm9yZGVyU3Ryb2tlLFxyXG4gICAgfTtcclxuICB9XHJcbiAgaWYgKHZOb2RlLnByb3BlcnRpZXMuc3R5bGVbJ2JvcmRlci1sZWZ0J10gJiYgdk5vZGUucHJvcGVydGllcy5zdHlsZVsnYm9yZGVyLWxlZnQnXSA9PT0gJzAnKSB7XHJcbiAgICBhdHRyaWJ1dGVzLnRhYmxlQ2VsbEJvcmRlciA9IHtcclxuICAgICAgLi4uYXR0cmlidXRlcy50YWJsZUNlbGxCb3JkZXIsXHJcbiAgICAgIGxlZnQ6IDAsXHJcbiAgICB9O1xyXG4gIH0gZWxzZSBpZiAoXHJcbiAgICB2Tm9kZS5wcm9wZXJ0aWVzLnN0eWxlWydib3JkZXItbGVmdCddICYmXHJcbiAgICB2Tm9kZS5wcm9wZXJ0aWVzLnN0eWxlWydib3JkZXItbGVmdCddICE9PSAnMCdcclxuICApIHtcclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZVxyXG4gICAgY29uc3QgW2JvcmRlclNpemUsIGJvcmRlclN0cm9rZSwgYm9yZGVyQ29sb3JdID0gY3NzQm9yZGVyUGFyc2VyKFxyXG4gICAgICB2Tm9kZS5wcm9wZXJ0aWVzLnN0eWxlWydib3JkZXItbGVmdCddXHJcbiAgICApO1xyXG4gICAgYXR0cmlidXRlcy50YWJsZUNlbGxCb3JkZXIgPSB7XHJcbiAgICAgIC4uLmF0dHJpYnV0ZXMudGFibGVDZWxsQm9yZGVyLFxyXG4gICAgICBsZWZ0OiBib3JkZXJTaXplLFxyXG4gICAgICBjb2xvcjogYm9yZGVyQ29sb3IsXHJcbiAgICAgIHN0cm9rZTogYm9yZGVyU3Ryb2tlLFxyXG4gICAgfTtcclxuICB9XHJcbiAgaWYgKHZOb2RlLnByb3BlcnRpZXMuc3R5bGVbJ2JvcmRlci1ib3R0b20nXSAmJiB2Tm9kZS5wcm9wZXJ0aWVzLnN0eWxlWydib3JkZXItYm90dG9tJ10gPT09ICcwJykge1xyXG4gICAgYXR0cmlidXRlcy50YWJsZUNlbGxCb3JkZXIgPSB7XHJcbiAgICAgIC4uLmF0dHJpYnV0ZXMudGFibGVDZWxsQm9yZGVyLFxyXG4gICAgICBib3R0b206IDAsXHJcbiAgICB9O1xyXG4gIH0gZWxzZSBpZiAoXHJcbiAgICB2Tm9kZS5wcm9wZXJ0aWVzLnN0eWxlWydib3JkZXItYm90dG9tJ10gJiZcclxuICAgIHZOb2RlLnByb3BlcnRpZXMuc3R5bGVbJ2JvcmRlci1ib3R0b20nXSAhPT0gJzAnXHJcbiAgKSB7XHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmVcclxuICAgIGNvbnN0IFtib3JkZXJTaXplLCBib3JkZXJTdHJva2UsIGJvcmRlckNvbG9yXSA9IGNzc0JvcmRlclBhcnNlcihcclxuICAgICAgdk5vZGUucHJvcGVydGllcy5zdHlsZVsnYm9yZGVyLWJvdHRvbSddXHJcbiAgICApO1xyXG4gICAgYXR0cmlidXRlcy50YWJsZUNlbGxCb3JkZXIgPSB7XHJcbiAgICAgIC4uLmF0dHJpYnV0ZXMudGFibGVDZWxsQm9yZGVyLFxyXG4gICAgICBib3R0b206IGJvcmRlclNpemUsXHJcbiAgICAgIGNvbG9yOiBib3JkZXJDb2xvcixcclxuICAgICAgc3Ryb2tlOiBib3JkZXJTdHJva2UsXHJcbiAgICB9O1xyXG4gIH1cclxuICBpZiAodk5vZGUucHJvcGVydGllcy5zdHlsZVsnYm9yZGVyLXJpZ2h0J10gJiYgdk5vZGUucHJvcGVydGllcy5zdHlsZVsnYm9yZGVyLXJpZ2h0J10gPT09ICcwJykge1xyXG4gICAgYXR0cmlidXRlcy50YWJsZUNlbGxCb3JkZXIgPSB7XHJcbiAgICAgIC4uLmF0dHJpYnV0ZXMudGFibGVDZWxsQm9yZGVyLFxyXG4gICAgICByaWdodDogMCxcclxuICAgIH07XHJcbiAgfSBlbHNlIGlmIChcclxuICAgIHZOb2RlLnByb3BlcnRpZXMuc3R5bGVbJ2JvcmRlci1yaWdodCddICYmXHJcbiAgICB2Tm9kZS5wcm9wZXJ0aWVzLnN0eWxlWydib3JkZXItcmlnaHQnXSAhPT0gJzAnXHJcbiAgKSB7XHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmVcclxuICAgIGNvbnN0IFtib3JkZXJTaXplLCBib3JkZXJTdHJva2UsIGJvcmRlckNvbG9yXSA9IGNzc0JvcmRlclBhcnNlcihcclxuICAgICAgdk5vZGUucHJvcGVydGllcy5zdHlsZVsnYm9yZGVyLXJpZ2h0J11cclxuICAgICk7XHJcbiAgICBhdHRyaWJ1dGVzLnRhYmxlQ2VsbEJvcmRlciA9IHtcclxuICAgICAgLi4uYXR0cmlidXRlcy50YWJsZUNlbGxCb3JkZXIsXHJcbiAgICAgIHJpZ2h0OiBib3JkZXJTaXplLFxyXG4gICAgICBjb2xvcjogYm9yZGVyQ29sb3IsXHJcbiAgICAgIHN0cm9rZTogYm9yZGVyU3Ryb2tlLFxyXG4gICAgfTtcclxuICB9XHJcbn07XHJcblxyXG5jb25zdCBidWlsZFRhYmxlQ2VsbCA9IGFzeW5jICh2Tm9kZSwgYXR0cmlidXRlcywgcm93U3Bhbk1hcCwgY29sdW1uSW5kZXgsIGRvY3hEb2N1bWVudEluc3RhbmNlKSA9PiB7XHJcbiAgY29uc3QgdGFibGVDZWxsRnJhZ21lbnQgPSBmcmFnbWVudCh7IG5hbWVzcGFjZUFsaWFzOiB7IHc6IG5hbWVzcGFjZXMudyB9IH0pLmVsZSgnQHcnLCAndGMnKTtcclxuXHJcbiAgbGV0IG1vZGlmaWVkQXR0cmlidXRlcyA9IHsgLi4uYXR0cmlidXRlcyB9O1xyXG4gIGlmIChpc1ZOb2RlKHZOb2RlKSAmJiB2Tm9kZS5wcm9wZXJ0aWVzKSB7XHJcbiAgICBpZiAodk5vZGUucHJvcGVydGllcy5yb3dTcGFuKSB7XHJcbiAgICAgIHJvd1NwYW5NYXAuc2V0KGNvbHVtbkluZGV4LmluZGV4LCB7IHJvd1NwYW46IHZOb2RlLnByb3BlcnRpZXMucm93U3BhbiAtIDEsIGNvbFNwYW46IDAgfSk7XHJcbiAgICAgIG1vZGlmaWVkQXR0cmlidXRlcy5yb3dTcGFuID0gJ3Jlc3RhcnQnO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgcHJldmlvdXNTcGFuT2JqZWN0ID0gcm93U3Bhbk1hcC5nZXQoY29sdW1uSW5kZXguaW5kZXgpO1xyXG4gICAgICByb3dTcGFuTWFwLnNldChcclxuICAgICAgICBjb2x1bW5JbmRleC5pbmRleCxcclxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLW9iamVjdC1zcHJlYWRcclxuICAgICAgICBPYmplY3QuYXNzaWduKHt9LCBwcmV2aW91c1NwYW5PYmplY3QsIHtcclxuICAgICAgICAgIHJvd1NwYW46IDAsXHJcbiAgICAgICAgICBjb2xTcGFuOiAocHJldmlvdXNTcGFuT2JqZWN0ICYmIHByZXZpb3VzU3Bhbk9iamVjdC5jb2xTcGFuKSB8fCAwLFxyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgICBpZiAoXHJcbiAgICAgIHZOb2RlLnByb3BlcnRpZXMuY29sU3BhbiB8fFxyXG4gICAgICAodk5vZGUucHJvcGVydGllcy5zdHlsZSAmJiB2Tm9kZS5wcm9wZXJ0aWVzLnN0eWxlWydjb2x1bW4tc3BhbiddKVxyXG4gICAgKSB7XHJcbiAgICAgIG1vZGlmaWVkQXR0cmlidXRlcy5jb2xTcGFuID1cclxuICAgICAgICB2Tm9kZS5wcm9wZXJ0aWVzLmNvbFNwYW4gfHxcclxuICAgICAgICAodk5vZGUucHJvcGVydGllcy5zdHlsZSAmJiB2Tm9kZS5wcm9wZXJ0aWVzLnN0eWxlWydjb2x1bW4tc3BhbiddKTtcclxuICAgICAgY29uc3QgcHJldmlvdXNTcGFuT2JqZWN0ID0gcm93U3Bhbk1hcC5nZXQoY29sdW1uSW5kZXguaW5kZXgpO1xyXG4gICAgICByb3dTcGFuTWFwLnNldChcclxuICAgICAgICBjb2x1bW5JbmRleC5pbmRleCxcclxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLW9iamVjdC1zcHJlYWRcclxuICAgICAgICBPYmplY3QuYXNzaWduKHt9LCBwcmV2aW91c1NwYW5PYmplY3QsIHtcclxuICAgICAgICAgIGNvbFNwYW46IHBhcnNlSW50KG1vZGlmaWVkQXR0cmlidXRlcy5jb2xTcGFuKSB8fCAwLFxyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgICAgIGNvbHVtbkluZGV4LmluZGV4ICs9IHBhcnNlSW50KG1vZGlmaWVkQXR0cmlidXRlcy5jb2xTcGFuKSAtIDE7XHJcbiAgICB9XHJcbiAgICBpZiAodk5vZGUucHJvcGVydGllcy5zdHlsZSkge1xyXG4gICAgICBtb2RpZmllZEF0dHJpYnV0ZXMgPSB7XHJcbiAgICAgICAgLi4ubW9kaWZpZWRBdHRyaWJ1dGVzLFxyXG4gICAgICAgIC4uLm1vZGlmaWVkU3R5bGVBdHRyaWJ1dGVzQnVpbGRlcih2Tm9kZSwgYXR0cmlidXRlcyksXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBmaXh1cFRhYmxlQ2VsbEJvcmRlcih2Tm9kZSwgbW9kaWZpZWRBdHRyaWJ1dGVzKTtcclxuICAgIH1cclxuICB9XHJcbiAgY29uc3QgdGFibGVDZWxsUHJvcGVydGllc0ZyYWdtZW50ID0gYnVpbGRUYWJsZUNlbGxQcm9wZXJ0aWVzKG1vZGlmaWVkQXR0cmlidXRlcyk7XHJcbiAgdGFibGVDZWxsRnJhZ21lbnQuaW1wb3J0KHRhYmxlQ2VsbFByb3BlcnRpZXNGcmFnbWVudCk7XHJcbiAgaWYgKHZOb2RlSGFzQ2hpbGRyZW4odk5vZGUpKSB7XHJcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdk5vZGUuY2hpbGRyZW4ubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgIGNvbnN0IGNoaWxkVk5vZGUgPSB2Tm9kZS5jaGlsZHJlbltpbmRleF07XHJcbiAgICAgIGlmIChpc1ZOb2RlKGNoaWxkVk5vZGUpICYmIGNoaWxkVk5vZGUudGFnTmFtZSA9PT0gJ2ltZycpIHtcclxuICAgICAgICBjb25zdCBpbWFnZUZyYWdtZW50ID0gYXdhaXQgYnVpbGRJbWFnZShcclxuICAgICAgICAgIGRvY3hEb2N1bWVudEluc3RhbmNlLFxyXG4gICAgICAgICAgY2hpbGRWTm9kZSxcclxuICAgICAgICAgIG1vZGlmaWVkQXR0cmlidXRlcy5tYXhpbXVtV2lkdGhcclxuICAgICAgICApO1xyXG4gICAgICAgIGlmIChpbWFnZUZyYWdtZW50KSB7XHJcbiAgICAgICAgICB0YWJsZUNlbGxGcmFnbWVudC5pbXBvcnQoaW1hZ2VGcmFnbWVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2UgaWYgKGlzVk5vZGUoY2hpbGRWTm9kZSkgJiYgY2hpbGRWTm9kZS50YWdOYW1lID09PSAnZmlndXJlJykge1xyXG4gICAgICAgIGlmICh2Tm9kZUhhc0NoaWxkcmVuKGNoaWxkVk5vZGUpKSB7XHJcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGx1c3BsdXNcclxuICAgICAgICAgIGZvciAobGV0IGl0ZXJhdG9ySW5kZXggPSAwOyBpdGVyYXRvckluZGV4IDwgY2hpbGRWTm9kZS5jaGlsZHJlbi5sZW5ndGg7IGl0ZXJhdG9ySW5kZXgrKykge1xyXG4gICAgICAgICAgICBjb25zdCBncmFuZENoaWxkVk5vZGUgPSBjaGlsZFZOb2RlLmNoaWxkcmVuW2l0ZXJhdG9ySW5kZXhdO1xyXG4gICAgICAgICAgICBpZiAoZ3JhbmRDaGlsZFZOb2RlLnRhZ05hbWUgPT09ICdpbWcnKSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgaW1hZ2VGcmFnbWVudCA9IGF3YWl0IGJ1aWxkSW1hZ2UoXHJcbiAgICAgICAgICAgICAgICBkb2N4RG9jdW1lbnRJbnN0YW5jZSxcclxuICAgICAgICAgICAgICAgIGdyYW5kQ2hpbGRWTm9kZSxcclxuICAgICAgICAgICAgICAgIG1vZGlmaWVkQXR0cmlidXRlcy5tYXhpbXVtV2lkdGhcclxuICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgIGlmIChpbWFnZUZyYWdtZW50KSB7XHJcbiAgICAgICAgICAgICAgICB0YWJsZUNlbGxGcmFnbWVudC5pbXBvcnQoaW1hZ2VGcmFnbWVudCk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2UgaWYgKGlzVk5vZGUoY2hpbGRWTm9kZSkgJiYgWyd1bCcsICdvbCddLmluY2x1ZGVzKGNoaWxkVk5vZGUudGFnTmFtZSkpIHtcclxuICAgICAgICAvLyByZW5kZXIgbGlzdCBpbiB0YWJsZVxyXG4gICAgICAgIGlmICh2Tm9kZUhhc0NoaWxkcmVuKGNoaWxkVk5vZGUpKSB7XHJcbiAgICAgICAgICBhd2FpdCBidWlsZExpc3QoY2hpbGRWTm9kZSwgZG9jeERvY3VtZW50SW5zdGFuY2UsIHRhYmxlQ2VsbEZyYWdtZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc3QgcGFyYWdyYXBoRnJhZ21lbnQgPSBhd2FpdCBidWlsZFBhcmFncmFwaChcclxuICAgICAgICAgIGNoaWxkVk5vZGUsXHJcbiAgICAgICAgICBtb2RpZmllZEF0dHJpYnV0ZXMsXHJcbiAgICAgICAgICBkb2N4RG9jdW1lbnRJbnN0YW5jZVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIHRhYmxlQ2VsbEZyYWdtZW50LmltcG9ydChwYXJhZ3JhcGhGcmFnbWVudCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9IGVsc2Uge1xyXG4gICAgLy8gVE9ETzogRmlndXJlIG91dCB3aHkgYnVpbGRpbmcgd2l0aCBidWlsZFBhcmFncmFwaCgpIGlzbid0IHdvcmtpbmdcclxuICAgIGNvbnN0IHBhcmFncmFwaEZyYWdtZW50ID0gZnJhZ21lbnQoeyBuYW1lc3BhY2VBbGlhczogeyB3OiBuYW1lc3BhY2VzLncgfSB9KVxyXG4gICAgICAuZWxlKCdAdycsICdwJylcclxuICAgICAgLnVwKCk7XHJcbiAgICB0YWJsZUNlbGxGcmFnbWVudC5pbXBvcnQocGFyYWdyYXBoRnJhZ21lbnQpO1xyXG4gIH1cclxuICB0YWJsZUNlbGxGcmFnbWVudC51cCgpO1xyXG5cclxuICByZXR1cm4gdGFibGVDZWxsRnJhZ21lbnQ7XHJcbn07XHJcblxyXG5jb25zdCBidWlsZFJvd1NwYW5DZWxsID0gKHJvd1NwYW5NYXAsIGNvbHVtbkluZGV4LCBhdHRyaWJ1dGVzKSA9PiB7XHJcbiAgY29uc3Qgcm93U3BhbkNlbGxGcmFnbWVudHMgPSBbXTtcclxuICBsZXQgc3Bhbk9iamVjdCA9IHJvd1NwYW5NYXAuZ2V0KGNvbHVtbkluZGV4LmluZGV4KTtcclxuICB3aGlsZSAoc3Bhbk9iamVjdCAmJiBzcGFuT2JqZWN0LnJvd1NwYW4pIHtcclxuICAgIGNvbnN0IHJvd1NwYW5DZWxsRnJhZ21lbnQgPSBmcmFnbWVudCh7IG5hbWVzcGFjZUFsaWFzOiB7IHc6IG5hbWVzcGFjZXMudyB9IH0pLmVsZSgnQHcnLCAndGMnKTtcclxuXHJcbiAgICBjb25zdCB0YWJsZUNlbGxQcm9wZXJ0aWVzRnJhZ21lbnQgPSBidWlsZFRhYmxlQ2VsbFByb3BlcnRpZXMoe1xyXG4gICAgICAuLi5hdHRyaWJ1dGVzLFxyXG4gICAgICByb3dTcGFuOiAnY29udGludWUnLFxyXG4gICAgICBjb2xTcGFuOiBzcGFuT2JqZWN0LmNvbFNwYW4gPyBzcGFuT2JqZWN0LmNvbFNwYW4gOiAwLFxyXG4gICAgfSk7XHJcbiAgICByb3dTcGFuQ2VsbEZyYWdtZW50LmltcG9ydCh0YWJsZUNlbGxQcm9wZXJ0aWVzRnJhZ21lbnQpO1xyXG5cclxuICAgIGNvbnN0IHBhcmFncmFwaEZyYWdtZW50ID0gZnJhZ21lbnQoeyBuYW1lc3BhY2VBbGlhczogeyB3OiBuYW1lc3BhY2VzLncgfSB9KVxyXG4gICAgICAuZWxlKCdAdycsICdwJylcclxuICAgICAgLnVwKCk7XHJcbiAgICByb3dTcGFuQ2VsbEZyYWdtZW50LmltcG9ydChwYXJhZ3JhcGhGcmFnbWVudCk7XHJcbiAgICByb3dTcGFuQ2VsbEZyYWdtZW50LnVwKCk7XHJcblxyXG4gICAgcm93U3BhbkNlbGxGcmFnbWVudHMucHVzaChyb3dTcGFuQ2VsbEZyYWdtZW50KTtcclxuXHJcbiAgICBpZiAoc3Bhbk9iamVjdC5yb3dTcGFuIC0gMSA9PT0gMCkge1xyXG4gICAgICByb3dTcGFuTWFwLmRlbGV0ZShjb2x1bW5JbmRleC5pbmRleCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByb3dTcGFuTWFwLnNldChjb2x1bW5JbmRleC5pbmRleCwge1xyXG4gICAgICAgIHJvd1NwYW46IHNwYW5PYmplY3Qucm93U3BhbiAtIDEsXHJcbiAgICAgICAgY29sU3Bhbjogc3Bhbk9iamVjdC5jb2xTcGFuIHx8IDAsXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgY29sdW1uSW5kZXguaW5kZXggKz0gc3Bhbk9iamVjdC5jb2xTcGFuIHx8IDE7XHJcbiAgICBzcGFuT2JqZWN0ID0gcm93U3Bhbk1hcC5nZXQoY29sdW1uSW5kZXguaW5kZXgpO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHJvd1NwYW5DZWxsRnJhZ21lbnRzO1xyXG59O1xyXG5cclxuY29uc3QgYnVpbGRUYWJsZVJvd1Byb3BlcnRpZXMgPSAoYXR0cmlidXRlcykgPT4ge1xyXG4gIGNvbnN0IHRhYmxlUm93UHJvcGVydGllc0ZyYWdtZW50ID0gZnJhZ21lbnQoeyBuYW1lc3BhY2VBbGlhczogeyB3OiBuYW1lc3BhY2VzLncgfSB9KS5lbGUoXHJcbiAgICAnQHcnLFxyXG4gICAgJ3RyUHInXHJcbiAgKTtcclxuICBpZiAoYXR0cmlidXRlcyAmJiBhdHRyaWJ1dGVzLmNvbnN0cnVjdG9yID09PSBPYmplY3QpIHtcclxuICAgIE9iamVjdC5rZXlzKGF0dHJpYnV0ZXMpLmZvckVhY2goKGtleSkgPT4ge1xyXG4gICAgICBzd2l0Y2ggKGtleSkge1xyXG4gICAgICAgIGNhc2UgJ3RhYmxlUm93SGVpZ2h0JzpcclxuICAgICAgICAgIGNvbnN0IHRhYmxlUm93SGVpZ2h0RnJhZ21lbnQgPSBidWlsZFRhYmxlUm93SGVpZ2h0KGF0dHJpYnV0ZXNba2V5XSk7XHJcbiAgICAgICAgICB0YWJsZVJvd1Byb3BlcnRpZXNGcmFnbWVudC5pbXBvcnQodGFibGVSb3dIZWlnaHRGcmFnbWVudCk7XHJcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cclxuICAgICAgICAgIGRlbGV0ZSBhdHRyaWJ1dGVzLnRhYmxlUm93SGVpZ2h0O1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSAncm93Q2FudFNwbGl0JzpcclxuICAgICAgICAgIGlmIChhdHRyaWJ1dGVzLnJvd0NhbnRTcGxpdCkge1xyXG4gICAgICAgICAgICBjb25zdCBjYW50U3BsaXRGcmFnbWVudCA9IGZyYWdtZW50KHsgbmFtZXNwYWNlQWxpYXM6IHsgdzogbmFtZXNwYWNlcy53IH0gfSlcclxuICAgICAgICAgICAgICAuZWxlKCdAdycsICdjYW50U3BsaXQnKVxyXG4gICAgICAgICAgICAgIC51cCgpO1xyXG4gICAgICAgICAgICB0YWJsZVJvd1Byb3BlcnRpZXNGcmFnbWVudC5pbXBvcnQoY2FudFNwbGl0RnJhZ21lbnQpO1xyXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cclxuICAgICAgICAgICAgZGVsZXRlIGF0dHJpYnV0ZXMucm93Q2FudFNwbGl0O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuICB0YWJsZVJvd1Byb3BlcnRpZXNGcmFnbWVudC51cCgpO1xyXG4gIHJldHVybiB0YWJsZVJvd1Byb3BlcnRpZXNGcmFnbWVudDtcclxufTtcclxuXHJcbmNvbnN0IGJ1aWxkVGFibGVSb3cgPSBhc3luYyAodk5vZGUsIGF0dHJpYnV0ZXMsIHJvd1NwYW5NYXAsIGRvY3hEb2N1bWVudEluc3RhbmNlKSA9PiB7XHJcbiAgY29uc3QgdGFibGVSb3dGcmFnbWVudCA9IGZyYWdtZW50KHsgbmFtZXNwYWNlQWxpYXM6IHsgdzogbmFtZXNwYWNlcy53IH0gfSkuZWxlKCdAdycsICd0cicpO1xyXG4gIGNvbnN0IG1vZGlmaWVkQXR0cmlidXRlcyA9IHsgLi4uYXR0cmlidXRlcyB9O1xyXG4gIGlmIChpc1ZOb2RlKHZOb2RlKSAmJiB2Tm9kZS5wcm9wZXJ0aWVzKSB7XHJcbiAgICAvLyBGSVhNRTogZmluZCBhIGJldHRlciB3YXkgdG8gZ2V0IHJvdyBoZWlnaHQgZnJvbSBjZWxsIHN0eWxlXHJcbiAgICBpZiAoXHJcbiAgICAgICh2Tm9kZS5wcm9wZXJ0aWVzLnN0eWxlICYmIHZOb2RlLnByb3BlcnRpZXMuc3R5bGUuaGVpZ2h0KSB8fFxyXG4gICAgICAodk5vZGUuY2hpbGRyZW5bMF0gJiZcclxuICAgICAgICBpc1ZOb2RlKHZOb2RlLmNoaWxkcmVuWzBdKSAmJlxyXG4gICAgICAgIHZOb2RlLmNoaWxkcmVuWzBdLnByb3BlcnRpZXMuc3R5bGUgJiZcclxuICAgICAgICB2Tm9kZS5jaGlsZHJlblswXS5wcm9wZXJ0aWVzLnN0eWxlLmhlaWdodClcclxuICAgICkge1xyXG4gICAgICBtb2RpZmllZEF0dHJpYnV0ZXMudGFibGVSb3dIZWlnaHQgPSBmaXh1cFJvd0hlaWdodChcclxuICAgICAgICAodk5vZGUucHJvcGVydGllcy5zdHlsZSAmJiB2Tm9kZS5wcm9wZXJ0aWVzLnN0eWxlLmhlaWdodCkgfHxcclxuICAgICAgICAodk5vZGUuY2hpbGRyZW5bMF0gJiZcclxuICAgICAgICAgIGlzVk5vZGUodk5vZGUuY2hpbGRyZW5bMF0pICYmXHJcbiAgICAgICAgICB2Tm9kZS5jaGlsZHJlblswXS5wcm9wZXJ0aWVzLnN0eWxlICYmXHJcbiAgICAgICAgICB2Tm9kZS5jaGlsZHJlblswXS5wcm9wZXJ0aWVzLnN0eWxlLmhlaWdodFxyXG4gICAgICAgICAgPyB2Tm9kZS5jaGlsZHJlblswXS5wcm9wZXJ0aWVzLnN0eWxlLmhlaWdodFxyXG4gICAgICAgICAgOiB1bmRlZmluZWQpXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgICBpZiAodk5vZGUucHJvcGVydGllcy5zdHlsZSkge1xyXG4gICAgICBmaXh1cFRhYmxlQ2VsbEJvcmRlcih2Tm9kZSwgbW9kaWZpZWRBdHRyaWJ1dGVzKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNvbnN0IHRhYmxlUm93UHJvcGVydGllc0ZyYWdtZW50ID0gYnVpbGRUYWJsZVJvd1Byb3BlcnRpZXMobW9kaWZpZWRBdHRyaWJ1dGVzKTtcclxuICB0YWJsZVJvd0ZyYWdtZW50LmltcG9ydCh0YWJsZVJvd1Byb3BlcnRpZXNGcmFnbWVudCk7XHJcblxyXG4gIGNvbnN0IGNvbHVtbkluZGV4ID0geyBpbmRleDogMCB9O1xyXG5cclxuICBpZiAodk5vZGVIYXNDaGlsZHJlbih2Tm9kZSkpIHtcclxuICAgIGNvbnN0IHRhYmxlQ29sdW1ucyA9IHZOb2RlLmNoaWxkcmVuLmZpbHRlcigoY2hpbGRWTm9kZSkgPT5cclxuICAgICAgWyd0ZCcsICd0aCddLmluY2x1ZGVzKGNoaWxkVk5vZGUudGFnTmFtZSlcclxuICAgICk7XHJcbiAgICBjb25zdCBtYXhpbXVtQ29sdW1uV2lkdGggPSBkb2N4RG9jdW1lbnRJbnN0YW5jZS5hdmFpbGFibGVEb2N1bWVudFNwYWNlIC8gdGFibGVDb2x1bW5zLmxlbmd0aDtcclxuXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXhcclxuICAgIGZvciAoY29uc3QgY29sdW1uIG9mIHRhYmxlQ29sdW1ucykge1xyXG4gICAgICBjb25zdCByb3dTcGFuQ2VsbEZyYWdtZW50cyA9IGJ1aWxkUm93U3BhbkNlbGwocm93U3Bhbk1hcCwgY29sdW1uSW5kZXgsIG1vZGlmaWVkQXR0cmlidXRlcyk7XHJcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHJvd1NwYW5DZWxsRnJhZ21lbnRzKSkge1xyXG4gICAgICAgIGZvciAobGV0IGl0ZXJhdG9ySW5kZXggPSAwOyBpdGVyYXRvckluZGV4IDwgcm93U3BhbkNlbGxGcmFnbWVudHMubGVuZ3RoOyBpdGVyYXRvckluZGV4KyspIHtcclxuICAgICAgICAgIGNvbnN0IHJvd1NwYW5DZWxsRnJhZ21lbnQgPSByb3dTcGFuQ2VsbEZyYWdtZW50c1tpdGVyYXRvckluZGV4XTtcclxuXHJcbiAgICAgICAgICB0YWJsZVJvd0ZyYWdtZW50LmltcG9ydChyb3dTcGFuQ2VsbEZyYWdtZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgdGFibGVDZWxsRnJhZ21lbnQgPSBhd2FpdCBidWlsZFRhYmxlQ2VsbChcclxuICAgICAgICBjb2x1bW4sXHJcbiAgICAgICAgeyAuLi5tb2RpZmllZEF0dHJpYnV0ZXMsIG1heGltdW1XaWR0aDogbWF4aW11bUNvbHVtbldpZHRoIH0sXHJcbiAgICAgICAgcm93U3Bhbk1hcCxcclxuICAgICAgICBjb2x1bW5JbmRleCxcclxuICAgICAgICBkb2N4RG9jdW1lbnRJbnN0YW5jZVxyXG4gICAgICApO1xyXG4gICAgICBjb2x1bW5JbmRleC5pbmRleCsrO1xyXG5cclxuICAgICAgdGFibGVSb3dGcmFnbWVudC5pbXBvcnQodGFibGVDZWxsRnJhZ21lbnQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaWYgKGNvbHVtbkluZGV4LmluZGV4IDwgcm93U3Bhbk1hcC5zaXplKSB7XHJcbiAgICBjb25zdCByb3dTcGFuQ2VsbEZyYWdtZW50cyA9IGJ1aWxkUm93U3BhbkNlbGwocm93U3Bhbk1hcCwgY29sdW1uSW5kZXgsIG1vZGlmaWVkQXR0cmlidXRlcyk7XHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheShyb3dTcGFuQ2VsbEZyYWdtZW50cykpIHtcclxuICAgICAgZm9yIChsZXQgaXRlcmF0b3JJbmRleCA9IDA7IGl0ZXJhdG9ySW5kZXggPCByb3dTcGFuQ2VsbEZyYWdtZW50cy5sZW5ndGg7IGl0ZXJhdG9ySW5kZXgrKykge1xyXG4gICAgICAgIGNvbnN0IHJvd1NwYW5DZWxsRnJhZ21lbnQgPSByb3dTcGFuQ2VsbEZyYWdtZW50c1tpdGVyYXRvckluZGV4XTtcclxuXHJcbiAgICAgICAgdGFibGVSb3dGcmFnbWVudC5pbXBvcnQocm93U3BhbkNlbGxGcmFnbWVudCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHRhYmxlUm93RnJhZ21lbnQudXAoKTtcclxuXHJcbiAgcmV0dXJuIHRhYmxlUm93RnJhZ21lbnQ7XHJcbn07XHJcblxyXG5jb25zdCBidWlsZFRhYmxlR3JpZENvbCA9IChncmlkV2lkdGgpID0+XHJcbiAgZnJhZ21lbnQoeyBuYW1lc3BhY2VBbGlhczogeyB3OiBuYW1lc3BhY2VzLncgfSB9KVxyXG4gICAgLmVsZSgnQHcnLCAnZ3JpZENvbCcpXHJcbiAgICAuYXR0KCdAdycsICd3JywgU3RyaW5nKGdyaWRXaWR0aCkpO1xyXG5cclxuY29uc3QgYnVpbGRUYWJsZUdyaWQgPSAodk5vZGUsIGF0dHJpYnV0ZXMpID0+IHtcclxuICBjb25zdCB0YWJsZUdyaWRGcmFnbWVudCA9IGZyYWdtZW50KHsgbmFtZXNwYWNlQWxpYXM6IHsgdzogbmFtZXNwYWNlcy53IH0gfSkuZWxlKCdAdycsICd0YmxHcmlkJyk7XHJcbiAgaWYgKHZOb2RlSGFzQ2hpbGRyZW4odk5vZGUpKSB7XHJcbiAgICBjb25zdCBncmlkQ29sdW1ucyA9IHZOb2RlLmNoaWxkcmVuLmZpbHRlcigoY2hpbGRWTm9kZSkgPT4gY2hpbGRWTm9kZS50YWdOYW1lID09PSAnY29sJyk7XHJcbiAgICBjb25zdCBncmlkV2lkdGggPSBhdHRyaWJ1dGVzLm1heGltdW1XaWR0aCAvIGdyaWRDb2x1bW5zLmxlbmd0aDtcclxuXHJcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgZ3JpZENvbHVtbnMubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgIGNvbnN0IHRhYmxlR3JpZENvbEZyYWdtZW50ID0gYnVpbGRUYWJsZUdyaWRDb2woZ3JpZFdpZHRoKTtcclxuICAgICAgdGFibGVHcmlkRnJhZ21lbnQuaW1wb3J0KHRhYmxlR3JpZENvbEZyYWdtZW50KTtcclxuICAgIH1cclxuICB9XHJcbiAgdGFibGVHcmlkRnJhZ21lbnQudXAoKTtcclxuXHJcbiAgcmV0dXJuIHRhYmxlR3JpZEZyYWdtZW50O1xyXG59O1xyXG5cclxuY29uc3QgYnVpbGRUYWJsZUdyaWRGcm9tVGFibGVSb3cgPSAodk5vZGUsIGF0dHJpYnV0ZXMpID0+IHtcclxuICBjb25zdCB0YWJsZUdyaWRGcmFnbWVudCA9IGZyYWdtZW50KHsgbmFtZXNwYWNlQWxpYXM6IHsgdzogbmFtZXNwYWNlcy53IH0gfSkuZWxlKCdAdycsICd0YmxHcmlkJyk7XHJcbiAgaWYgKHZOb2RlSGFzQ2hpbGRyZW4odk5vZGUpKSB7XHJcbiAgICBjb25zdCBudW1iZXJPZkdyaWRDb2x1bW5zID0gdk5vZGUuY2hpbGRyZW4ucmVkdWNlKChhY2N1bXVsYXRvciwgY2hpbGRWTm9kZSkgPT4ge1xyXG4gICAgICBjb25zdCBjb2xTcGFuID1cclxuICAgICAgICBjaGlsZFZOb2RlLnByb3BlcnRpZXMuY29sU3BhbiB8fFxyXG4gICAgICAgIChjaGlsZFZOb2RlLnByb3BlcnRpZXMuc3R5bGUgJiYgY2hpbGRWTm9kZS5wcm9wZXJ0aWVzLnN0eWxlWydjb2x1bW4tc3BhbiddKTtcclxuXHJcbiAgICAgIHJldHVybiBhY2N1bXVsYXRvciArIChjb2xTcGFuID8gcGFyc2VJbnQoY29sU3BhbikgOiAxKTtcclxuICAgIH0sIDApO1xyXG4gICAgY29uc3QgZ3JpZFdpZHRoID0gYXR0cmlidXRlcy5tYXhpbXVtV2lkdGggLyBudW1iZXJPZkdyaWRDb2x1bW5zO1xyXG5cclxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBudW1iZXJPZkdyaWRDb2x1bW5zOyBpbmRleCsrKSB7XHJcbiAgICAgIGNvbnN0IHRhYmxlR3JpZENvbEZyYWdtZW50ID0gYnVpbGRUYWJsZUdyaWRDb2woZ3JpZFdpZHRoKTtcclxuICAgICAgdGFibGVHcmlkRnJhZ21lbnQuaW1wb3J0KHRhYmxlR3JpZENvbEZyYWdtZW50KTtcclxuICAgIH1cclxuICB9XHJcbiAgdGFibGVHcmlkRnJhZ21lbnQudXAoKTtcclxuXHJcbiAgcmV0dXJuIHRhYmxlR3JpZEZyYWdtZW50O1xyXG59O1xyXG5cclxuY29uc3QgYnVpbGRUYWJsZUJvcmRlcnMgPSAodGFibGVCb3JkZXIpID0+IHtcclxuICBjb25zdCB0YWJsZUJvcmRlcnNGcmFnbWVudCA9IGZyYWdtZW50KHsgbmFtZXNwYWNlQWxpYXM6IHsgdzogbmFtZXNwYWNlcy53IH0gfSkuZWxlKFxyXG4gICAgJ0B3JyxcclxuICAgICd0YmxCb3JkZXJzJ1xyXG4gICk7XHJcblxyXG4gIGNvbnN0IHsgY29sb3IsIHN0cm9rZSwgLi4uYm9yZGVycyB9ID0gdGFibGVCb3JkZXI7XHJcblxyXG4gIE9iamVjdC5rZXlzKGJvcmRlcnMpLmZvckVhY2goKGJvcmRlcikgPT4ge1xyXG4gICAgaWYgKGJvcmRlcnNbYm9yZGVyXSkge1xyXG4gICAgICBjb25zdCBib3JkZXJGcmFnbWVudCA9IGJ1aWxkQm9yZGVyKGJvcmRlciwgYm9yZGVyc1tib3JkZXJdLCAwLCBjb2xvciwgc3Ryb2tlKTtcclxuICAgICAgdGFibGVCb3JkZXJzRnJhZ21lbnQuaW1wb3J0KGJvcmRlckZyYWdtZW50KTtcclxuICAgIH1cclxuICB9KTtcclxuXHJcbiAgdGFibGVCb3JkZXJzRnJhZ21lbnQudXAoKTtcclxuXHJcbiAgcmV0dXJuIHRhYmxlQm9yZGVyc0ZyYWdtZW50O1xyXG59O1xyXG5cclxuY29uc3QgYnVpbGRUYWJsZVdpZHRoID0gKHRhYmxlV2lkdGgpID0+XHJcbiAgZnJhZ21lbnQoeyBuYW1lc3BhY2VBbGlhczogeyB3OiBuYW1lc3BhY2VzLncgfSB9KVxyXG4gICAgLmVsZSgnQHcnLCAndGJsVycpXHJcbiAgICAuYXR0KCdAdycsICd0eXBlJywgJ2R4YScpXHJcbiAgICAuYXR0KCdAdycsICd3JywgU3RyaW5nKHRhYmxlV2lkdGgpKVxyXG4gICAgLnVwKCk7XHJcblxyXG5jb25zdCBidWlsZENlbGxNYXJnaW4gPSAoc2lkZSwgbWFyZ2luKSA9PlxyXG4gIGZyYWdtZW50KHsgbmFtZXNwYWNlQWxpYXM6IHsgdzogbmFtZXNwYWNlcy53IH0gfSlcclxuICAgIC5lbGUoJ0B3Jywgc2lkZSlcclxuICAgIC5hdHQoJ0B3JywgJ3R5cGUnLCAnZHhhJylcclxuICAgIC5hdHQoJ0B3JywgJ3cnLCBTdHJpbmcobWFyZ2luKSlcclxuICAgIC51cCgpO1xyXG5cclxuY29uc3QgYnVpbGRUYWJsZUNlbGxNYXJnaW5zID0gKG1hcmdpbikgPT4ge1xyXG4gIGNvbnN0IHRhYmxlQ2VsbE1hckZyYWdtZW50ID0gZnJhZ21lbnQoeyBuYW1lc3BhY2VBbGlhczogeyB3OiBuYW1lc3BhY2VzLncgfSB9KS5lbGUoXHJcbiAgICAnQHcnLFxyXG4gICAgJ3RibENlbGxNYXInXHJcbiAgKTtcclxuXHJcbiAgWyd0b3AnLCAnYm90dG9tJ10uZm9yRWFjaCgoc2lkZSkgPT4ge1xyXG4gICAgY29uc3QgbWFyZ2luRnJhZ21lbnQgPSBidWlsZENlbGxNYXJnaW4oc2lkZSwgbWFyZ2luIC8gMik7XHJcbiAgICB0YWJsZUNlbGxNYXJGcmFnbWVudC5pbXBvcnQobWFyZ2luRnJhZ21lbnQpO1xyXG4gIH0pO1xyXG4gIFsnbGVmdCcsICdyaWdodCddLmZvckVhY2goKHNpZGUpID0+IHtcclxuICAgIGNvbnN0IG1hcmdpbkZyYWdtZW50ID0gYnVpbGRDZWxsTWFyZ2luKHNpZGUsIG1hcmdpbik7XHJcbiAgICB0YWJsZUNlbGxNYXJGcmFnbWVudC5pbXBvcnQobWFyZ2luRnJhZ21lbnQpO1xyXG4gIH0pO1xyXG5cclxuICByZXR1cm4gdGFibGVDZWxsTWFyRnJhZ21lbnQ7XHJcbn07XHJcblxyXG5jb25zdCBidWlsZFRhYmxlUHJvcGVydGllcyA9IChhdHRyaWJ1dGVzKSA9PiB7XHJcbiAgY29uc3QgdGFibGVQcm9wZXJ0aWVzRnJhZ21lbnQgPSBmcmFnbWVudCh7IG5hbWVzcGFjZUFsaWFzOiB7IHc6IG5hbWVzcGFjZXMudyB9IH0pLmVsZShcclxuICAgICdAdycsXHJcbiAgICAndGJsUHInXHJcbiAgKTtcclxuXHJcbiAgaWYgKGF0dHJpYnV0ZXMgJiYgYXR0cmlidXRlcy5jb25zdHJ1Y3RvciA9PT0gT2JqZWN0KSB7XHJcbiAgICBPYmplY3Qua2V5cyhhdHRyaWJ1dGVzKS5mb3JFYWNoKChrZXkpID0+IHtcclxuICAgICAgc3dpdGNoIChrZXkpIHtcclxuICAgICAgICBjYXNlICd0YWJsZUJvcmRlcic6XHJcbiAgICAgICAgICBjb25zdCB0YWJsZUJvcmRlcnNGcmFnbWVudCA9IGJ1aWxkVGFibGVCb3JkZXJzKGF0dHJpYnV0ZXNba2V5XSk7XHJcbiAgICAgICAgICB0YWJsZVByb3BlcnRpZXNGcmFnbWVudC5pbXBvcnQodGFibGVCb3JkZXJzRnJhZ21lbnQpO1xyXG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXHJcbiAgICAgICAgICBkZWxldGUgYXR0cmlidXRlcy50YWJsZUJvcmRlcjtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgJ3RhYmxlQ2VsbFNwYWNpbmcnOlxyXG4gICAgICAgICAgY29uc3QgdGFibGVDZWxsU3BhY2luZ0ZyYWdtZW50ID0gYnVpbGRUYWJsZUNlbGxTcGFjaW5nKGF0dHJpYnV0ZXNba2V5XSk7XHJcbiAgICAgICAgICB0YWJsZVByb3BlcnRpZXNGcmFnbWVudC5pbXBvcnQodGFibGVDZWxsU3BhY2luZ0ZyYWdtZW50KTtcclxuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxyXG4gICAgICAgICAgZGVsZXRlIGF0dHJpYnV0ZXMudGFibGVDZWxsU3BhY2luZztcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgJ3dpZHRoJzpcclxuICAgICAgICAgIGlmIChhdHRyaWJ1dGVzW2tleV0pIHtcclxuICAgICAgICAgICAgY29uc3QgdGFibGVXaWR0aEZyYWdtZW50ID0gYnVpbGRUYWJsZVdpZHRoKGF0dHJpYnV0ZXNba2V5XSk7XHJcbiAgICAgICAgICAgIHRhYmxlUHJvcGVydGllc0ZyYWdtZW50LmltcG9ydCh0YWJsZVdpZHRoRnJhZ21lbnQpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXHJcbiAgICAgICAgICBkZWxldGUgYXR0cmlidXRlcy53aWR0aDtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcbiAgY29uc3QgdGFibGVDZWxsTWFyZ2luRnJhZ21lbnQgPSBidWlsZFRhYmxlQ2VsbE1hcmdpbnMoMTYwKTtcclxuICB0YWJsZVByb3BlcnRpZXNGcmFnbWVudC5pbXBvcnQodGFibGVDZWxsTWFyZ2luRnJhZ21lbnQpO1xyXG5cclxuICAvLyBieSBkZWZhdWx0LCBhbGwgdGFibGVzIGFyZSBjZW50ZXIgYWxpZ25lZC5cclxuICBjb25zdCBhbGlnbm1lbnRGcmFnbWVudCA9IGJ1aWxkSG9yaXpvbnRhbEFsaWdubWVudCgnY2VudGVyJyk7XHJcbiAgdGFibGVQcm9wZXJ0aWVzRnJhZ21lbnQuaW1wb3J0KGFsaWdubWVudEZyYWdtZW50KTtcclxuXHJcbiAgdGFibGVQcm9wZXJ0aWVzRnJhZ21lbnQudXAoKTtcclxuXHJcbiAgcmV0dXJuIHRhYmxlUHJvcGVydGllc0ZyYWdtZW50O1xyXG59O1xyXG5cclxuY29uc3QgY3NzQm9yZGVyUGFyc2VyID0gKGJvcmRlclN0cmluZykgPT4ge1xyXG4gIGxldCBbc2l6ZSwgc3Ryb2tlLCBjb2xvcl0gPSBib3JkZXJTdHJpbmcuc3BsaXQoJyAnKTtcclxuXHJcbiAgaWYgKHBvaW50UmVnZXgudGVzdChzaXplKSkge1xyXG4gICAgY29uc3QgbWF0Y2hlZFBhcnRzID0gc2l6ZS5tYXRjaChwb2ludFJlZ2V4KTtcclxuICAgIC8vIGNvbnZlcnQgcG9pbnQgdG8gZWlnaHRoIG9mIGEgcG9pbnRcclxuICAgIHNpemUgPSBwb2ludFRvRUlQKG1hdGNoZWRQYXJ0c1sxXSk7XHJcbiAgfSBlbHNlIGlmIChwaXhlbFJlZ2V4LnRlc3Qoc2l6ZSkpIHtcclxuICAgIGNvbnN0IG1hdGNoZWRQYXJ0cyA9IHNpemUubWF0Y2gocGl4ZWxSZWdleCk7XHJcbiAgICAvLyBjb252ZXJ0IHBpeGVscyB0byBlaWdodGggb2YgYSBwb2ludFxyXG4gICAgc2l6ZSA9IHBpeGVsVG9FSVAobWF0Y2hlZFBhcnRzWzFdKTtcclxuICB9XHJcbiAgc3Ryb2tlID0gc3Ryb2tlICYmIFsnZGFzaGVkJywgJ2RvdHRlZCcsICdkb3VibGUnXS5pbmNsdWRlcyhzdHJva2UpID8gc3Ryb2tlIDogJ3NpbmdsZSc7XHJcblxyXG4gIGNvbG9yID0gY29sb3IgJiYgZml4dXBDb2xvckNvZGUoY29sb3IpLnRvVXBwZXJDYXNlKCk7XHJcblxyXG4gIHJldHVybiBbc2l6ZSwgc3Ryb2tlLCBjb2xvcl07XHJcbn07XHJcblxyXG5jb25zdCBidWlsZFRhYmxlID0gYXN5bmMgKHZOb2RlLCBhdHRyaWJ1dGVzLCBkb2N4RG9jdW1lbnRJbnN0YW5jZSkgPT4ge1xyXG4gIGNvbnN0IHRhYmxlRnJhZ21lbnQgPSBmcmFnbWVudCh7IG5hbWVzcGFjZUFsaWFzOiB7IHc6IG5hbWVzcGFjZXMudyB9IH0pLmVsZSgnQHcnLCAndGJsJyk7XHJcbiAgY29uc3QgbW9kaWZpZWRBdHRyaWJ1dGVzID0geyAuLi5hdHRyaWJ1dGVzIH07XHJcbiAgaWYgKGlzVk5vZGUodk5vZGUpICYmIHZOb2RlLnByb3BlcnRpZXMpIHtcclxuICAgIGNvbnN0IHRhYmxlQXR0cmlidXRlcyA9IHZOb2RlLnByb3BlcnRpZXMuYXR0cmlidXRlcyB8fCB7fTtcclxuICAgIGNvbnN0IHRhYmxlU3R5bGVzID0gdk5vZGUucHJvcGVydGllcy5zdHlsZSB8fCB7fTtcclxuICAgIGNvbnN0IHRhYmxlQm9yZGVycyA9IHt9O1xyXG4gICAgY29uc3QgdGFibGVDZWxsQm9yZGVycyA9IHt9O1xyXG4gICAgbGV0IFtib3JkZXJTaXplLCBib3JkZXJTdHJpa2UsIGJvcmRlckNvbG9yXSA9IFsyLCAnc2luZ2xlJywgJzAwMDAwMCddO1xyXG5cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLWdsb2JhbHNcclxuICAgIGlmICghaXNOYU4odGFibGVBdHRyaWJ1dGVzLmJvcmRlcikpIHtcclxuICAgICAgYm9yZGVyU2l6ZSA9IHBhcnNlSW50KHRhYmxlQXR0cmlidXRlcy5ib3JkZXIsIDEwKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBjc3Mgc3R5bGUgb3ZlcnJpZGVzIHRhYmxlIGJvcmRlciBwcm9wZXJ0aWVzXHJcbiAgICBpZiAodGFibGVTdHlsZXMuYm9yZGVyKSB7XHJcbiAgICAgIGNvbnN0IFtjc3NTaXplLCBjc3NTdHJva2UsIGNzc0NvbG9yXSA9IGNzc0JvcmRlclBhcnNlcih0YWJsZVN0eWxlcy5ib3JkZXIpO1xyXG4gICAgICBib3JkZXJTaXplID0gY3NzU2l6ZSB8fCBib3JkZXJTaXplO1xyXG4gICAgICBib3JkZXJDb2xvciA9IGNzc0NvbG9yIHx8IGJvcmRlckNvbG9yO1xyXG4gICAgICBib3JkZXJTdHJpa2UgPSBjc3NTdHJva2UgfHwgYm9yZGVyU3RyaWtlO1xyXG4gICAgfVxyXG5cclxuICAgIHRhYmxlQm9yZGVycy50b3AgPSBib3JkZXJTaXplO1xyXG4gICAgdGFibGVCb3JkZXJzLmJvdHRvbSA9IGJvcmRlclNpemU7XHJcbiAgICB0YWJsZUJvcmRlcnMubGVmdCA9IGJvcmRlclNpemU7XHJcbiAgICB0YWJsZUJvcmRlcnMucmlnaHQgPSBib3JkZXJTaXplO1xyXG4gICAgdGFibGVCb3JkZXJzLnN0cm9rZSA9IGJvcmRlclN0cmlrZTtcclxuICAgIHRhYmxlQm9yZGVycy5jb2xvciA9IGJvcmRlckNvbG9yO1xyXG5cclxuICAgIGlmICh0YWJsZVN0eWxlc1snYm9yZGVyLWNvbGxhcHNlJ10gPT09ICdjb2xsYXBzZScpIHtcclxuICAgICAgdGFibGVCb3JkZXJzLmluc2lkZVYgPSBib3JkZXJTaXplO1xyXG4gICAgICB0YWJsZUJvcmRlcnMuaW5zaWRlSCA9IGJvcmRlclNpemU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0YWJsZUJvcmRlcnMuaW5zaWRlViA9IDA7XHJcbiAgICAgIHRhYmxlQm9yZGVycy5pbnNpZGVIID0gMDtcclxuICAgICAgdGFibGVDZWxsQm9yZGVycy50b3AgPSAxO1xyXG4gICAgICB0YWJsZUNlbGxCb3JkZXJzLmJvdHRvbSA9IDE7XHJcbiAgICAgIHRhYmxlQ2VsbEJvcmRlcnMubGVmdCA9IDE7XHJcbiAgICAgIHRhYmxlQ2VsbEJvcmRlcnMucmlnaHQgPSAxO1xyXG4gICAgfVxyXG5cclxuICAgIG1vZGlmaWVkQXR0cmlidXRlcy50YWJsZUJvcmRlciA9IHRhYmxlQm9yZGVycztcclxuICAgIG1vZGlmaWVkQXR0cmlidXRlcy50YWJsZUNlbGxTcGFjaW5nID0gMDtcclxuXHJcbiAgICBpZiAoT2JqZWN0LmtleXModGFibGVDZWxsQm9yZGVycykubGVuZ3RoKSB7XHJcbiAgICAgIG1vZGlmaWVkQXR0cmlidXRlcy50YWJsZUNlbGxCb3JkZXIgPSB0YWJsZUNlbGxCb3JkZXJzO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBtaW5pbXVtV2lkdGg7XHJcbiAgICBsZXQgbWF4aW11bVdpZHRoO1xyXG4gICAgbGV0IHdpZHRoO1xyXG4gICAgLy8gQ2FsY3VsYXRlIG1pbmltdW0gd2lkdGggb2YgdGFibGVcclxuICAgIGlmIChwaXhlbFJlZ2V4LnRlc3QodGFibGVTdHlsZXNbJ21pbi13aWR0aCddKSkge1xyXG4gICAgICBtaW5pbXVtV2lkdGggPSBwaXhlbFRvVFdJUCh0YWJsZVN0eWxlc1snbWluLXdpZHRoJ10ubWF0Y2gocGl4ZWxSZWdleClbMV0pO1xyXG4gICAgfSBlbHNlIGlmIChwZXJjZW50YWdlUmVnZXgudGVzdCh0YWJsZVN0eWxlc1snbWluLXdpZHRoJ10pKSB7XHJcbiAgICAgIGNvbnN0IHBlcmNlbnRhZ2VWYWx1ZSA9IHRhYmxlU3R5bGVzWydtaW4td2lkdGgnXS5tYXRjaChwZXJjZW50YWdlUmVnZXgpWzFdO1xyXG4gICAgICBtaW5pbXVtV2lkdGggPSBNYXRoLnJvdW5kKChwZXJjZW50YWdlVmFsdWUgLyAxMDApICogYXR0cmlidXRlcy5tYXhpbXVtV2lkdGgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIENhbGN1bGF0ZSBtYXhpbXVtIHdpZHRoIG9mIHRhYmxlXHJcbiAgICBpZiAocGl4ZWxSZWdleC50ZXN0KHRhYmxlU3R5bGVzWydtYXgtd2lkdGgnXSkpIHtcclxuICAgICAgcGl4ZWxSZWdleC5sYXN0SW5kZXggPSAwO1xyXG4gICAgICBtYXhpbXVtV2lkdGggPSBwaXhlbFRvVFdJUCh0YWJsZVN0eWxlc1snbWF4LXdpZHRoJ10ubWF0Y2gocGl4ZWxSZWdleClbMV0pO1xyXG4gICAgfSBlbHNlIGlmIChwZXJjZW50YWdlUmVnZXgudGVzdCh0YWJsZVN0eWxlc1snbWF4LXdpZHRoJ10pKSB7XHJcbiAgICAgIHBlcmNlbnRhZ2VSZWdleC5sYXN0SW5kZXggPSAwO1xyXG4gICAgICBjb25zdCBwZXJjZW50YWdlVmFsdWUgPSB0YWJsZVN0eWxlc1snbWF4LXdpZHRoJ10ubWF0Y2gocGVyY2VudGFnZVJlZ2V4KVsxXTtcclxuICAgICAgbWF4aW11bVdpZHRoID0gTWF0aC5yb3VuZCgocGVyY2VudGFnZVZhbHVlIC8gMTAwKSAqIGF0dHJpYnV0ZXMubWF4aW11bVdpZHRoKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBDYWxjdWxhdGUgc3BlY2lmaWVkIHdpZHRoIG9mIHRhYmxlXHJcbiAgICBpZiAocGl4ZWxSZWdleC50ZXN0KHRhYmxlU3R5bGVzLndpZHRoKSkge1xyXG4gICAgICBwaXhlbFJlZ2V4Lmxhc3RJbmRleCA9IDA7XHJcbiAgICAgIHdpZHRoID0gcGl4ZWxUb1RXSVAodGFibGVTdHlsZXMud2lkdGgubWF0Y2gocGl4ZWxSZWdleClbMV0pO1xyXG4gICAgfSBlbHNlIGlmIChwZXJjZW50YWdlUmVnZXgudGVzdCh0YWJsZVN0eWxlcy53aWR0aCkpIHtcclxuICAgICAgcGVyY2VudGFnZVJlZ2V4Lmxhc3RJbmRleCA9IDA7XHJcbiAgICAgIGNvbnN0IHBlcmNlbnRhZ2VWYWx1ZSA9IHRhYmxlU3R5bGVzLndpZHRoLm1hdGNoKHBlcmNlbnRhZ2VSZWdleClbMV07XHJcbiAgICAgIHdpZHRoID0gTWF0aC5yb3VuZCgocGVyY2VudGFnZVZhbHVlIC8gMTAwKSAqIGF0dHJpYnV0ZXMubWF4aW11bVdpZHRoKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBJZiB3aWR0aCBpc24ndCBzdXBwbGllZCwgd2Ugc2hvdWxkIGhhdmUgbWluLXdpZHRoIGFzIHRoZSB3aWR0aC5cclxuICAgIGlmICh3aWR0aCkge1xyXG4gICAgICBtb2RpZmllZEF0dHJpYnV0ZXMud2lkdGggPSB3aWR0aDtcclxuICAgICAgaWYgKG1heGltdW1XaWR0aCkge1xyXG4gICAgICAgIG1vZGlmaWVkQXR0cmlidXRlcy53aWR0aCA9IE1hdGgubWluKG1vZGlmaWVkQXR0cmlidXRlcy53aWR0aCwgbWF4aW11bVdpZHRoKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAobWluaW11bVdpZHRoKSB7XHJcbiAgICAgICAgbW9kaWZpZWRBdHRyaWJ1dGVzLndpZHRoID0gTWF0aC5tYXgobW9kaWZpZWRBdHRyaWJ1dGVzLndpZHRoLCBtaW5pbXVtV2lkdGgpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKG1pbmltdW1XaWR0aCkge1xyXG4gICAgICBtb2RpZmllZEF0dHJpYnV0ZXMud2lkdGggPSBtaW5pbXVtV2lkdGg7XHJcbiAgICB9XHJcbiAgICBpZiAobW9kaWZpZWRBdHRyaWJ1dGVzLndpZHRoKSB7XHJcbiAgICAgIG1vZGlmaWVkQXR0cmlidXRlcy53aWR0aCA9IE1hdGgubWluKG1vZGlmaWVkQXR0cmlidXRlcy53aWR0aCwgYXR0cmlidXRlcy5tYXhpbXVtV2lkdGgpO1xyXG4gICAgfVxyXG4gIH1cclxuICBjb25zdCB0YWJsZVByb3BlcnRpZXNGcmFnbWVudCA9IGJ1aWxkVGFibGVQcm9wZXJ0aWVzKG1vZGlmaWVkQXR0cmlidXRlcyk7XHJcbiAgdGFibGVGcmFnbWVudC5pbXBvcnQodGFibGVQcm9wZXJ0aWVzRnJhZ21lbnQpO1xyXG5cclxuICBjb25zdCByb3dTcGFuTWFwID0gbmV3IE1hcCgpO1xyXG5cclxuICBpZiAodk5vZGVIYXNDaGlsZHJlbih2Tm9kZSkpIHtcclxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB2Tm9kZS5jaGlsZHJlbi5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgY29uc3QgY2hpbGRWTm9kZSA9IHZOb2RlLmNoaWxkcmVuW2luZGV4XTtcclxuICAgICAgaWYgKGNoaWxkVk5vZGUudGFnTmFtZSA9PT0gJ2NvbGdyb3VwJykge1xyXG4gICAgICAgIGNvbnN0IHRhYmxlR3JpZEZyYWdtZW50ID0gYnVpbGRUYWJsZUdyaWQoY2hpbGRWTm9kZSwgbW9kaWZpZWRBdHRyaWJ1dGVzKTtcclxuICAgICAgICB0YWJsZUZyYWdtZW50LmltcG9ydCh0YWJsZUdyaWRGcmFnbWVudCk7XHJcbiAgICAgIH0gZWxzZSBpZiAoY2hpbGRWTm9kZS50YWdOYW1lID09PSAndGhlYWQnKSB7XHJcbiAgICAgICAgZm9yIChsZXQgaXRlcmF0b3JJbmRleCA9IDA7IGl0ZXJhdG9ySW5kZXggPCBjaGlsZFZOb2RlLmNoaWxkcmVuLmxlbmd0aDsgaXRlcmF0b3JJbmRleCsrKSB7XHJcbiAgICAgICAgICBjb25zdCBncmFuZENoaWxkVk5vZGUgPSBjaGlsZFZOb2RlLmNoaWxkcmVuW2l0ZXJhdG9ySW5kZXhdO1xyXG4gICAgICAgICAgaWYgKGdyYW5kQ2hpbGRWTm9kZS50YWdOYW1lID09PSAndHInKSB7XHJcbiAgICAgICAgICAgIGlmIChpdGVyYXRvckluZGV4ID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgdGFibGVHcmlkRnJhZ21lbnQgPSBidWlsZFRhYmxlR3JpZEZyb21UYWJsZVJvdyhcclxuICAgICAgICAgICAgICAgIGdyYW5kQ2hpbGRWTm9kZSxcclxuICAgICAgICAgICAgICAgIG1vZGlmaWVkQXR0cmlidXRlc1xyXG4gICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgdGFibGVGcmFnbWVudC5pbXBvcnQodGFibGVHcmlkRnJhZ21lbnQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IHRhYmxlUm93RnJhZ21lbnQgPSBhd2FpdCBidWlsZFRhYmxlUm93KFxyXG4gICAgICAgICAgICAgIGdyYW5kQ2hpbGRWTm9kZSxcclxuICAgICAgICAgICAgICBtb2RpZmllZEF0dHJpYnV0ZXMsXHJcbiAgICAgICAgICAgICAgcm93U3Bhbk1hcCxcclxuICAgICAgICAgICAgICBkb2N4RG9jdW1lbnRJbnN0YW5jZVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB0YWJsZUZyYWdtZW50LmltcG9ydCh0YWJsZVJvd0ZyYWdtZW50KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSBpZiAoY2hpbGRWTm9kZS50YWdOYW1lID09PSAndGJvZHknKSB7XHJcbiAgICAgICAgZm9yIChsZXQgaXRlcmF0b3JJbmRleCA9IDA7IGl0ZXJhdG9ySW5kZXggPCBjaGlsZFZOb2RlLmNoaWxkcmVuLmxlbmd0aDsgaXRlcmF0b3JJbmRleCsrKSB7XHJcbiAgICAgICAgICBjb25zdCBncmFuZENoaWxkVk5vZGUgPSBjaGlsZFZOb2RlLmNoaWxkcmVuW2l0ZXJhdG9ySW5kZXhdO1xyXG4gICAgICAgICAgaWYgKGdyYW5kQ2hpbGRWTm9kZS50YWdOYW1lID09PSAndHInKSB7XHJcbiAgICAgICAgICAgIGlmIChpdGVyYXRvckluZGV4ID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgdGFibGVHcmlkRnJhZ21lbnQgPSBidWlsZFRhYmxlR3JpZEZyb21UYWJsZVJvdyhcclxuICAgICAgICAgICAgICAgIGdyYW5kQ2hpbGRWTm9kZSxcclxuICAgICAgICAgICAgICAgIG1vZGlmaWVkQXR0cmlidXRlc1xyXG4gICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgdGFibGVGcmFnbWVudC5pbXBvcnQodGFibGVHcmlkRnJhZ21lbnQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IHRhYmxlUm93RnJhZ21lbnQgPSBhd2FpdCBidWlsZFRhYmxlUm93KFxyXG4gICAgICAgICAgICAgIGdyYW5kQ2hpbGRWTm9kZSxcclxuICAgICAgICAgICAgICBtb2RpZmllZEF0dHJpYnV0ZXMsXHJcbiAgICAgICAgICAgICAgcm93U3Bhbk1hcCxcclxuICAgICAgICAgICAgICBkb2N4RG9jdW1lbnRJbnN0YW5jZVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB0YWJsZUZyYWdtZW50LmltcG9ydCh0YWJsZVJvd0ZyYWdtZW50KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSBpZiAoY2hpbGRWTm9kZS50YWdOYW1lID09PSAndHInKSB7XHJcbiAgICAgICAgaWYgKGluZGV4ID09PSAwKSB7XHJcbiAgICAgICAgICBjb25zdCB0YWJsZUdyaWRGcmFnbWVudCA9IGJ1aWxkVGFibGVHcmlkRnJvbVRhYmxlUm93KGNoaWxkVk5vZGUsIG1vZGlmaWVkQXR0cmlidXRlcyk7XHJcbiAgICAgICAgICB0YWJsZUZyYWdtZW50LmltcG9ydCh0YWJsZUdyaWRGcmFnbWVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHRhYmxlUm93RnJhZ21lbnQgPSBhd2FpdCBidWlsZFRhYmxlUm93KFxyXG4gICAgICAgICAgY2hpbGRWTm9kZSxcclxuICAgICAgICAgIG1vZGlmaWVkQXR0cmlidXRlcyxcclxuICAgICAgICAgIHJvd1NwYW5NYXAsXHJcbiAgICAgICAgICBkb2N4RG9jdW1lbnRJbnN0YW5jZVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgdGFibGVGcmFnbWVudC5pbXBvcnQodGFibGVSb3dGcmFnbWVudCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbiAgdGFibGVGcmFnbWVudC51cCgpO1xyXG5cclxuICByZXR1cm4gdGFibGVGcmFnbWVudDtcclxufTtcclxuXHJcbmNvbnN0IGJ1aWxkUHJlc2V0R2VvbWV0cnkgPSAoKSA9PlxyXG4gIGZyYWdtZW50KHsgbmFtZXNwYWNlQWxpYXM6IHsgYTogbmFtZXNwYWNlcy5hIH0gfSlcclxuICAgIC5lbGUoJ0BhJywgJ3Byc3RHZW9tJylcclxuICAgIC5hdHQoJ3Byc3QnLCAncmVjdCcpXHJcbiAgICAudXAoKTtcclxuXHJcbmNvbnN0IGJ1aWxkRXh0ZW50cyA9ICh7IHdpZHRoLCBoZWlnaHQgfSkgPT5cclxuICBmcmFnbWVudCh7IG5hbWVzcGFjZUFsaWFzOiB7IGE6IG5hbWVzcGFjZXMuYSB9IH0pXHJcbiAgICAuZWxlKCdAYScsICdleHQnKVxyXG4gICAgLmF0dCgnY3gnLCB3aWR0aClcclxuICAgIC5hdHQoJ2N5JywgaGVpZ2h0KVxyXG4gICAgLnVwKCk7XHJcblxyXG5jb25zdCBidWlsZE9mZnNldCA9ICgpID0+XHJcbiAgZnJhZ21lbnQoeyBuYW1lc3BhY2VBbGlhczogeyBhOiBuYW1lc3BhY2VzLmEgfSB9KVxyXG4gICAgLmVsZSgnQGEnLCAnb2ZmJylcclxuICAgIC5hdHQoJ3gnLCAnMCcpXHJcbiAgICAuYXR0KCd5JywgJzAnKVxyXG4gICAgLnVwKCk7XHJcblxyXG5jb25zdCBidWlsZEdyYXBoaWNGcmFtZVRyYW5zZm9ybSA9IChhdHRyaWJ1dGVzKSA9PiB7XHJcbiAgY29uc3QgZ3JhcGhpY0ZyYW1lVHJhbnNmb3JtRnJhZ21lbnQgPSBmcmFnbWVudCh7IG5hbWVzcGFjZUFsaWFzOiB7IGE6IG5hbWVzcGFjZXMuYSB9IH0pLmVsZShcclxuICAgICdAYScsXHJcbiAgICAneGZybSdcclxuICApO1xyXG5cclxuICBjb25zdCBvZmZzZXRGcmFnbWVudCA9IGJ1aWxkT2Zmc2V0KCk7XHJcbiAgZ3JhcGhpY0ZyYW1lVHJhbnNmb3JtRnJhZ21lbnQuaW1wb3J0KG9mZnNldEZyYWdtZW50KTtcclxuICBjb25zdCBleHRlbnRzRnJhZ21lbnQgPSBidWlsZEV4dGVudHMoYXR0cmlidXRlcyk7XHJcbiAgZ3JhcGhpY0ZyYW1lVHJhbnNmb3JtRnJhZ21lbnQuaW1wb3J0KGV4dGVudHNGcmFnbWVudCk7XHJcblxyXG4gIGdyYXBoaWNGcmFtZVRyYW5zZm9ybUZyYWdtZW50LnVwKCk7XHJcblxyXG4gIHJldHVybiBncmFwaGljRnJhbWVUcmFuc2Zvcm1GcmFnbWVudDtcclxufTtcclxuXHJcbmNvbnN0IGJ1aWxkU2hhcGVQcm9wZXJ0aWVzID0gKGF0dHJpYnV0ZXMpID0+IHtcclxuICBjb25zdCBzaGFwZVByb3BlcnRpZXMgPSBmcmFnbWVudCh7IG5hbWVzcGFjZUFsaWFzOiB7IHBpYzogbmFtZXNwYWNlcy5waWMgfSB9KS5lbGUoJ0BwaWMnLCAnc3BQcicpO1xyXG5cclxuICBjb25zdCBncmFwaGljRnJhbWVUcmFuc2Zvcm1GcmFnbWVudCA9IGJ1aWxkR3JhcGhpY0ZyYW1lVHJhbnNmb3JtKGF0dHJpYnV0ZXMpO1xyXG4gIHNoYXBlUHJvcGVydGllcy5pbXBvcnQoZ3JhcGhpY0ZyYW1lVHJhbnNmb3JtRnJhZ21lbnQpO1xyXG4gIGNvbnN0IHByZXNldEdlb21ldHJ5RnJhZ21lbnQgPSBidWlsZFByZXNldEdlb21ldHJ5KCk7XHJcbiAgc2hhcGVQcm9wZXJ0aWVzLmltcG9ydChwcmVzZXRHZW9tZXRyeUZyYWdtZW50KTtcclxuXHJcbiAgc2hhcGVQcm9wZXJ0aWVzLnVwKCk7XHJcblxyXG4gIHJldHVybiBzaGFwZVByb3BlcnRpZXM7XHJcbn07XHJcblxyXG5jb25zdCBidWlsZEZpbGxSZWN0ID0gKCkgPT5cclxuICBmcmFnbWVudCh7IG5hbWVzcGFjZUFsaWFzOiB7IGE6IG5hbWVzcGFjZXMuYSB9IH0pXHJcbiAgICAuZWxlKCdAYScsICdmaWxsUmVjdCcpXHJcbiAgICAudXAoKTtcclxuXHJcbmNvbnN0IGJ1aWxkU3RyZXRjaCA9ICgpID0+IHtcclxuICBjb25zdCBzdHJldGNoRnJhZ21lbnQgPSBmcmFnbWVudCh7IG5hbWVzcGFjZUFsaWFzOiB7IGE6IG5hbWVzcGFjZXMuYSB9IH0pLmVsZSgnQGEnLCAnc3RyZXRjaCcpO1xyXG5cclxuICBjb25zdCBmaWxsUmVjdEZyYWdtZW50ID0gYnVpbGRGaWxsUmVjdCgpO1xyXG4gIHN0cmV0Y2hGcmFnbWVudC5pbXBvcnQoZmlsbFJlY3RGcmFnbWVudCk7XHJcblxyXG4gIHN0cmV0Y2hGcmFnbWVudC51cCgpO1xyXG5cclxuICByZXR1cm4gc3RyZXRjaEZyYWdtZW50O1xyXG59O1xyXG5cclxuY29uc3QgYnVpbGRTcmNSZWN0RnJhZ21lbnQgPSAoKSA9PlxyXG4gIGZyYWdtZW50KHsgbmFtZXNwYWNlQWxpYXM6IHsgYTogbmFtZXNwYWNlcy5hIH0gfSlcclxuICAgIC5lbGUoJ0BhJywgJ3NyY1JlY3QnKVxyXG4gICAgLmF0dCgnYicsICcwJylcclxuICAgIC5hdHQoJ2wnLCAnMCcpXHJcbiAgICAuYXR0KCdyJywgJzAnKVxyXG4gICAgLmF0dCgndCcsICcwJylcclxuICAgIC51cCgpO1xyXG5cclxuY29uc3QgYnVpbGRCaW5hcnlMYXJnZUltYWdlT3JQaWN0dXJlID0gKHJlbGF0aW9uc2hpcElkKSA9PlxyXG4gIGZyYWdtZW50KHtcclxuICAgIG5hbWVzcGFjZUFsaWFzOiB7IGE6IG5hbWVzcGFjZXMuYSwgcjogbmFtZXNwYWNlcy5yIH0sXHJcbiAgfSlcclxuICAgIC5lbGUoJ0BhJywgJ2JsaXAnKVxyXG4gICAgLmF0dCgnQHInLCAnZW1iZWQnLCBgcklkJHtyZWxhdGlvbnNoaXBJZH1gKVxyXG4gICAgLy8gRklYTUU6IHBvc3NpYmxlIHZhbHVlcyAnZW1haWwnLCAnbm9uZScsICdwcmludCcsICdocXByaW50JywgJ3NjcmVlbidcclxuICAgIC5hdHQoJ2NzdGF0ZScsICdwcmludCcpXHJcbiAgICAudXAoKTtcclxuXHJcbmNvbnN0IGJ1aWxkQmluYXJ5TGFyZ2VJbWFnZU9yUGljdHVyZUZpbGwgPSAocmVsYXRpb25zaGlwSWQpID0+IHtcclxuICBjb25zdCBiaW5hcnlMYXJnZUltYWdlT3JQaWN0dXJlRmlsbEZyYWdtZW50ID0gZnJhZ21lbnQoe1xyXG4gICAgbmFtZXNwYWNlQWxpYXM6IHsgcGljOiBuYW1lc3BhY2VzLnBpYyB9LFxyXG4gIH0pLmVsZSgnQHBpYycsICdibGlwRmlsbCcpO1xyXG4gIGNvbnN0IGJpbmFyeUxhcmdlSW1hZ2VPclBpY3R1cmVGcmFnbWVudCA9IGJ1aWxkQmluYXJ5TGFyZ2VJbWFnZU9yUGljdHVyZShyZWxhdGlvbnNoaXBJZCk7XHJcbiAgYmluYXJ5TGFyZ2VJbWFnZU9yUGljdHVyZUZpbGxGcmFnbWVudC5pbXBvcnQoYmluYXJ5TGFyZ2VJbWFnZU9yUGljdHVyZUZyYWdtZW50KTtcclxuICBjb25zdCBzcmNSZWN0RnJhZ21lbnQgPSBidWlsZFNyY1JlY3RGcmFnbWVudCgpO1xyXG4gIGJpbmFyeUxhcmdlSW1hZ2VPclBpY3R1cmVGaWxsRnJhZ21lbnQuaW1wb3J0KHNyY1JlY3RGcmFnbWVudCk7XHJcbiAgY29uc3Qgc3RyZXRjaEZyYWdtZW50ID0gYnVpbGRTdHJldGNoKCk7XHJcbiAgYmluYXJ5TGFyZ2VJbWFnZU9yUGljdHVyZUZpbGxGcmFnbWVudC5pbXBvcnQoc3RyZXRjaEZyYWdtZW50KTtcclxuXHJcbiAgYmluYXJ5TGFyZ2VJbWFnZU9yUGljdHVyZUZpbGxGcmFnbWVudC51cCgpO1xyXG5cclxuICByZXR1cm4gYmluYXJ5TGFyZ2VJbWFnZU9yUGljdHVyZUZpbGxGcmFnbWVudDtcclxufTtcclxuXHJcbmNvbnN0IGJ1aWxkTm9uVmlzdWFsUGljdHVyZURyYXdpbmdQcm9wZXJ0aWVzID0gKCkgPT5cclxuICBmcmFnbWVudCh7IG5hbWVzcGFjZUFsaWFzOiB7IHBpYzogbmFtZXNwYWNlcy5waWMgfSB9KVxyXG4gICAgLmVsZSgnQHBpYycsICdjTnZQaWNQcicpXHJcbiAgICAudXAoKTtcclxuXHJcbmNvbnN0IGJ1aWxkTm9uVmlzdWFsRHJhd2luZ1Byb3BlcnRpZXMgPSAoXHJcbiAgcGljdHVyZUlkLFxyXG4gIHBpY3R1cmVOYW1lV2l0aEV4dGVuc2lvbixcclxuICBwaWN0dXJlRGVzY3JpcHRpb24gPSAnJ1xyXG4pID0+XHJcbiAgZnJhZ21lbnQoeyBuYW1lc3BhY2VBbGlhczogeyBwaWM6IG5hbWVzcGFjZXMucGljIH0gfSlcclxuICAgIC5lbGUoJ0BwaWMnLCAnY052UHInKVxyXG4gICAgLmF0dCgnaWQnLCBwaWN0dXJlSWQpXHJcbiAgICAuYXR0KCduYW1lJywgcGljdHVyZU5hbWVXaXRoRXh0ZW5zaW9uKVxyXG4gICAgLmF0dCgnZGVzY3InLCBwaWN0dXJlRGVzY3JpcHRpb24pXHJcbiAgICAudXAoKTtcclxuXHJcbmNvbnN0IGJ1aWxkTm9uVmlzdWFsUGljdHVyZVByb3BlcnRpZXMgPSAoXHJcbiAgcGljdHVyZUlkLFxyXG4gIHBpY3R1cmVOYW1lV2l0aEV4dGVuc2lvbixcclxuICBwaWN0dXJlRGVzY3JpcHRpb25cclxuKSA9PiB7XHJcbiAgY29uc3Qgbm9uVmlzdWFsUGljdHVyZVByb3BlcnRpZXNGcmFnbWVudCA9IGZyYWdtZW50KHtcclxuICAgIG5hbWVzcGFjZUFsaWFzOiB7IHBpYzogbmFtZXNwYWNlcy5waWMgfSxcclxuICB9KS5lbGUoJ0BwaWMnLCAnbnZQaWNQcicpO1xyXG4gIC8vIFRPRE86IEhhbmRsZSBwaWN0dXJlIGF0dHJpYnV0ZXNcclxuICBjb25zdCBub25WaXN1YWxEcmF3aW5nUHJvcGVydGllc0ZyYWdtZW50ID0gYnVpbGROb25WaXN1YWxEcmF3aW5nUHJvcGVydGllcyhcclxuICAgIHBpY3R1cmVJZCxcclxuICAgIHBpY3R1cmVOYW1lV2l0aEV4dGVuc2lvbixcclxuICAgIHBpY3R1cmVEZXNjcmlwdGlvblxyXG4gICk7XHJcbiAgbm9uVmlzdWFsUGljdHVyZVByb3BlcnRpZXNGcmFnbWVudC5pbXBvcnQobm9uVmlzdWFsRHJhd2luZ1Byb3BlcnRpZXNGcmFnbWVudCk7XHJcbiAgY29uc3Qgbm9uVmlzdWFsUGljdHVyZURyYXdpbmdQcm9wZXJ0aWVzRnJhZ21lbnQgPSBidWlsZE5vblZpc3VhbFBpY3R1cmVEcmF3aW5nUHJvcGVydGllcygpO1xyXG4gIG5vblZpc3VhbFBpY3R1cmVQcm9wZXJ0aWVzRnJhZ21lbnQuaW1wb3J0KG5vblZpc3VhbFBpY3R1cmVEcmF3aW5nUHJvcGVydGllc0ZyYWdtZW50KTtcclxuICBub25WaXN1YWxQaWN0dXJlUHJvcGVydGllc0ZyYWdtZW50LnVwKCk7XHJcblxyXG4gIHJldHVybiBub25WaXN1YWxQaWN0dXJlUHJvcGVydGllc0ZyYWdtZW50O1xyXG59O1xyXG5cclxuY29uc3QgYnVpbGRQaWN0dXJlID0gKHtcclxuICBpZCxcclxuICBmaWxlTmFtZVdpdGhFeHRlbnNpb24sXHJcbiAgZGVzY3JpcHRpb24sXHJcbiAgcmVsYXRpb25zaGlwSWQsXHJcbiAgd2lkdGgsXHJcbiAgaGVpZ2h0LFxyXG59KSA9PiB7XHJcbiAgY29uc3QgcGljdHVyZUZyYWdtZW50ID0gZnJhZ21lbnQoeyBuYW1lc3BhY2VBbGlhczogeyBwaWM6IG5hbWVzcGFjZXMucGljIH0gfSkuZWxlKCdAcGljJywgJ3BpYycpO1xyXG4gIGNvbnN0IG5vblZpc3VhbFBpY3R1cmVQcm9wZXJ0aWVzRnJhZ21lbnQgPSBidWlsZE5vblZpc3VhbFBpY3R1cmVQcm9wZXJ0aWVzKFxyXG4gICAgaWQsXHJcbiAgICBmaWxlTmFtZVdpdGhFeHRlbnNpb24sXHJcbiAgICBkZXNjcmlwdGlvblxyXG4gICk7XHJcbiAgcGljdHVyZUZyYWdtZW50LmltcG9ydChub25WaXN1YWxQaWN0dXJlUHJvcGVydGllc0ZyYWdtZW50KTtcclxuICBjb25zdCBiaW5hcnlMYXJnZUltYWdlT3JQaWN0dXJlRmlsbCA9IGJ1aWxkQmluYXJ5TGFyZ2VJbWFnZU9yUGljdHVyZUZpbGwocmVsYXRpb25zaGlwSWQpO1xyXG4gIHBpY3R1cmVGcmFnbWVudC5pbXBvcnQoYmluYXJ5TGFyZ2VJbWFnZU9yUGljdHVyZUZpbGwpO1xyXG4gIGNvbnN0IHNoYXBlUHJvcGVydGllcyA9IGJ1aWxkU2hhcGVQcm9wZXJ0aWVzKHsgd2lkdGgsIGhlaWdodCB9KTtcclxuICBwaWN0dXJlRnJhZ21lbnQuaW1wb3J0KHNoYXBlUHJvcGVydGllcyk7XHJcbiAgcGljdHVyZUZyYWdtZW50LnVwKCk7XHJcblxyXG4gIHJldHVybiBwaWN0dXJlRnJhZ21lbnQ7XHJcbn07XHJcblxyXG5jb25zdCBidWlsZEdyYXBoaWNEYXRhID0gKGdyYXBoaWNUeXBlLCBhdHRyaWJ1dGVzKSA9PiB7XHJcbiAgY29uc3QgZ3JhcGhpY0RhdGFGcmFnbWVudCA9IGZyYWdtZW50KHsgbmFtZXNwYWNlQWxpYXM6IHsgYTogbmFtZXNwYWNlcy5hIH0gfSlcclxuICAgIC5lbGUoJ0BhJywgJ2dyYXBoaWNEYXRhJylcclxuICAgIC5hdHQoJ3VyaScsICdodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvZHJhd2luZ21sLzIwMDYvcGljdHVyZScpO1xyXG4gIGlmIChncmFwaGljVHlwZSA9PT0gJ3BpY3R1cmUnKSB7XHJcbiAgICBjb25zdCBwaWN0dXJlRnJhZ21lbnQgPSBidWlsZFBpY3R1cmUoYXR0cmlidXRlcyk7XHJcbiAgICBncmFwaGljRGF0YUZyYWdtZW50LmltcG9ydChwaWN0dXJlRnJhZ21lbnQpO1xyXG4gIH1cclxuICBncmFwaGljRGF0YUZyYWdtZW50LnVwKCk7XHJcblxyXG4gIHJldHVybiBncmFwaGljRGF0YUZyYWdtZW50O1xyXG59O1xyXG5cclxuY29uc3QgYnVpbGRHcmFwaGljID0gKGdyYXBoaWNUeXBlLCBhdHRyaWJ1dGVzKSA9PiB7XHJcbiAgY29uc3QgZ3JhcGhpY0ZyYWdtZW50ID0gZnJhZ21lbnQoeyBuYW1lc3BhY2VBbGlhczogeyBhOiBuYW1lc3BhY2VzLmEgfSB9KS5lbGUoJ0BhJywgJ2dyYXBoaWMnKTtcclxuICAvLyBUT0RPOiBIYW5kbGUgZHJhd2luZyB0eXBlXHJcbiAgY29uc3QgZ3JhcGhpY0RhdGFGcmFnbWVudCA9IGJ1aWxkR3JhcGhpY0RhdGEoZ3JhcGhpY1R5cGUsIGF0dHJpYnV0ZXMpO1xyXG4gIGdyYXBoaWNGcmFnbWVudC5pbXBvcnQoZ3JhcGhpY0RhdGFGcmFnbWVudCk7XHJcbiAgZ3JhcGhpY0ZyYWdtZW50LnVwKCk7XHJcblxyXG4gIHJldHVybiBncmFwaGljRnJhZ21lbnQ7XHJcbn07XHJcblxyXG5jb25zdCBidWlsZERyYXdpbmdPYmplY3ROb25WaXN1YWxQcm9wZXJ0aWVzID0gKHBpY3R1cmVJZCwgcGljdHVyZU5hbWUpID0+XHJcbiAgZnJhZ21lbnQoeyBuYW1lc3BhY2VBbGlhczogeyB3cDogbmFtZXNwYWNlcy53cCB9IH0pXHJcbiAgICAuZWxlKCdAd3AnLCAnZG9jUHInKVxyXG4gICAgLmF0dCgnaWQnLCBwaWN0dXJlSWQpXHJcbiAgICAuYXR0KCduYW1lJywgcGljdHVyZU5hbWUpXHJcbiAgICAudXAoKTtcclxuXHJcbmNvbnN0IGJ1aWxkV3JhcFNxdWFyZSA9ICgpID0+XHJcbiAgZnJhZ21lbnQoeyBuYW1lc3BhY2VBbGlhczogeyB3cDogbmFtZXNwYWNlcy53cCB9IH0pXHJcbiAgICAuZWxlKCdAd3AnLCAnd3JhcFNxdWFyZScpXHJcbiAgICAuYXR0KCd3cmFwVGV4dCcsICdib3RoU2lkZXMnKVxyXG4gICAgLmF0dCgnZGlzdEInLCAnMjI4NjAwJylcclxuICAgIC5hdHQoJ2Rpc3RUJywgJzIyODYwMCcpXHJcbiAgICAuYXR0KCdkaXN0TCcsICcyMjg2MDAnKVxyXG4gICAgLmF0dCgnZGlzdFInLCAnMjI4NjAwJylcclxuICAgIC51cCgpO1xyXG5cclxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXHJcbmNvbnN0IGJ1aWxkV3JhcE5vbmUgPSAoKSA9PlxyXG4gIGZyYWdtZW50KHsgbmFtZXNwYWNlQWxpYXM6IHsgd3A6IG5hbWVzcGFjZXMud3AgfSB9KVxyXG4gICAgLmVsZSgnQHdwJywgJ3dyYXBOb25lJylcclxuICAgIC51cCgpO1xyXG5cclxuY29uc3QgYnVpbGRFZmZlY3RFeHRlbnRGcmFnbWVudCA9ICgpID0+XHJcbiAgZnJhZ21lbnQoeyBuYW1lc3BhY2VBbGlhczogeyB3cDogbmFtZXNwYWNlcy53cCB9IH0pXHJcbiAgICAuZWxlKCdAd3AnLCAnZWZmZWN0RXh0ZW50JylcclxuICAgIC5hdHQoJ2InLCAnMCcpXHJcbiAgICAuYXR0KCdsJywgJzAnKVxyXG4gICAgLmF0dCgncicsICcwJylcclxuICAgIC5hdHQoJ3QnLCAnMCcpXHJcbiAgICAudXAoKTtcclxuXHJcbmNvbnN0IGJ1aWxkRXh0ZW50ID0gKHsgd2lkdGgsIGhlaWdodCB9KSA9PlxyXG4gIGZyYWdtZW50KHsgbmFtZXNwYWNlQWxpYXM6IHsgd3A6IG5hbWVzcGFjZXMud3AgfSB9KVxyXG4gICAgLmVsZSgnQHdwJywgJ2V4dGVudCcpXHJcbiAgICAuYXR0KCdjeCcsIHdpZHRoKVxyXG4gICAgLmF0dCgnY3knLCBoZWlnaHQpXHJcbiAgICAudXAoKTtcclxuXHJcbmNvbnN0IGJ1aWxkUG9zaXRpb25WID0gKCkgPT5cclxuICBmcmFnbWVudCh7IG5hbWVzcGFjZUFsaWFzOiB7IHdwOiBuYW1lc3BhY2VzLndwIH0gfSlcclxuICAgIC5lbGUoJ0B3cCcsICdwb3NpdGlvblYnKVxyXG4gICAgLmF0dCgncmVsYXRpdmVGcm9tJywgJ3BhcmFncmFwaCcpXHJcbiAgICAuZWxlKCdAd3AnLCAncG9zT2Zmc2V0JylcclxuICAgIC50eHQoJzE5MDUwJylcclxuICAgIC51cCgpXHJcbiAgICAudXAoKTtcclxuXHJcbmNvbnN0IGJ1aWxkUG9zaXRpb25IID0gKCkgPT5cclxuICBmcmFnbWVudCh7IG5hbWVzcGFjZUFsaWFzOiB7IHdwOiBuYW1lc3BhY2VzLndwIH0gfSlcclxuICAgIC5lbGUoJ0B3cCcsICdwb3NpdGlvbkgnKVxyXG4gICAgLmF0dCgncmVsYXRpdmVGcm9tJywgJ2NvbHVtbicpXHJcbiAgICAuZWxlKCdAd3AnLCAncG9zT2Zmc2V0JylcclxuICAgIC50eHQoJzE5MDUwJylcclxuICAgIC51cCgpXHJcbiAgICAudXAoKTtcclxuXHJcbmNvbnN0IGJ1aWxkU2ltcGxlUG9zID0gKCkgPT5cclxuICBmcmFnbWVudCh7IG5hbWVzcGFjZUFsaWFzOiB7IHdwOiBuYW1lc3BhY2VzLndwIH0gfSlcclxuICAgIC5lbGUoJ0B3cCcsICdzaW1wbGVQb3MnKVxyXG4gICAgLmF0dCgneCcsICcwJylcclxuICAgIC5hdHQoJ3knLCAnMCcpXHJcbiAgICAudXAoKTtcclxuXHJcbmNvbnN0IGJ1aWxkQW5jaG9yZWREcmF3aW5nID0gKGdyYXBoaWNUeXBlLCBhdHRyaWJ1dGVzKSA9PiB7XHJcbiAgY29uc3QgYW5jaG9yZWREcmF3aW5nRnJhZ21lbnQgPSBmcmFnbWVudCh7IG5hbWVzcGFjZUFsaWFzOiB7IHdwOiBuYW1lc3BhY2VzLndwIH0gfSlcclxuICAgIC5lbGUoJ0B3cCcsICdhbmNob3InKVxyXG4gICAgLmF0dCgnZGlzdEInLCAnMCcpXHJcbiAgICAuYXR0KCdkaXN0TCcsICcwJylcclxuICAgIC5hdHQoJ2Rpc3RSJywgJzAnKVxyXG4gICAgLmF0dCgnZGlzdFQnLCAnMCcpXHJcbiAgICAuYXR0KCdyZWxhdGl2ZUhlaWdodCcsICcwJylcclxuICAgIC5hdHQoJ2JlaGluZERvYycsICdmYWxzZScpXHJcbiAgICAuYXR0KCdsb2NrZWQnLCAndHJ1ZScpXHJcbiAgICAuYXR0KCdsYXlvdXRJbkNlbGwnLCAndHJ1ZScpXHJcbiAgICAuYXR0KCdhbGxvd092ZXJsYXAnLCAnZmFsc2UnKVxyXG4gICAgLmF0dCgnc2ltcGxlUG9zJywgJ2ZhbHNlJyk7XHJcbiAgLy8gRXZlbiB0aG91Z2ggc2ltcGxlUG9zIGlzbnQgc3VwcG9ydGVkIGJ5IFdvcmQgMjAwNyBzaW1wbGVQb3MgaXMgcmVxdWlyZWQuXHJcbiAgY29uc3Qgc2ltcGxlUG9zRnJhZ21lbnQgPSBidWlsZFNpbXBsZVBvcygpO1xyXG4gIGFuY2hvcmVkRHJhd2luZ0ZyYWdtZW50LmltcG9ydChzaW1wbGVQb3NGcmFnbWVudCk7XHJcbiAgY29uc3QgcG9zaXRpb25IRnJhZ21lbnQgPSBidWlsZFBvc2l0aW9uSCgpO1xyXG4gIGFuY2hvcmVkRHJhd2luZ0ZyYWdtZW50LmltcG9ydChwb3NpdGlvbkhGcmFnbWVudCk7XHJcbiAgY29uc3QgcG9zaXRpb25WRnJhZ21lbnQgPSBidWlsZFBvc2l0aW9uVigpO1xyXG4gIGFuY2hvcmVkRHJhd2luZ0ZyYWdtZW50LmltcG9ydChwb3NpdGlvblZGcmFnbWVudCk7XHJcbiAgY29uc3QgZXh0ZW50RnJhZ21lbnQgPSBidWlsZEV4dGVudCh7IHdpZHRoOiBhdHRyaWJ1dGVzLndpZHRoLCBoZWlnaHQ6IGF0dHJpYnV0ZXMuaGVpZ2h0IH0pO1xyXG4gIGFuY2hvcmVkRHJhd2luZ0ZyYWdtZW50LmltcG9ydChleHRlbnRGcmFnbWVudCk7XHJcbiAgY29uc3QgZWZmZWN0RXh0ZW50RnJhZ21lbnQgPSBidWlsZEVmZmVjdEV4dGVudEZyYWdtZW50KCk7XHJcbiAgYW5jaG9yZWREcmF3aW5nRnJhZ21lbnQuaW1wb3J0KGVmZmVjdEV4dGVudEZyYWdtZW50KTtcclxuICBjb25zdCB3cmFwU3F1YXJlRnJhZ21lbnQgPSBidWlsZFdyYXBTcXVhcmUoKTtcclxuICBhbmNob3JlZERyYXdpbmdGcmFnbWVudC5pbXBvcnQod3JhcFNxdWFyZUZyYWdtZW50KTtcclxuICBjb25zdCBkcmF3aW5nT2JqZWN0Tm9uVmlzdWFsUHJvcGVydGllc0ZyYWdtZW50ID0gYnVpbGREcmF3aW5nT2JqZWN0Tm9uVmlzdWFsUHJvcGVydGllcyhcclxuICAgIGF0dHJpYnV0ZXMuaWQsXHJcbiAgICBhdHRyaWJ1dGVzLmZpbGVOYW1lV2l0aEV4dGVuc2lvblxyXG4gICk7XHJcbiAgYW5jaG9yZWREcmF3aW5nRnJhZ21lbnQuaW1wb3J0KGRyYXdpbmdPYmplY3ROb25WaXN1YWxQcm9wZXJ0aWVzRnJhZ21lbnQpO1xyXG4gIGNvbnN0IGdyYXBoaWNGcmFnbWVudCA9IGJ1aWxkR3JhcGhpYyhncmFwaGljVHlwZSwgYXR0cmlidXRlcyk7XHJcbiAgYW5jaG9yZWREcmF3aW5nRnJhZ21lbnQuaW1wb3J0KGdyYXBoaWNGcmFnbWVudCk7XHJcblxyXG4gIGFuY2hvcmVkRHJhd2luZ0ZyYWdtZW50LnVwKCk7XHJcblxyXG4gIHJldHVybiBhbmNob3JlZERyYXdpbmdGcmFnbWVudDtcclxufTtcclxuXHJcbmNvbnN0IGJ1aWxkSW5saW5lRHJhd2luZyA9IChncmFwaGljVHlwZSwgYXR0cmlidXRlcykgPT4ge1xyXG4gIGNvbnN0IGlubGluZURyYXdpbmdGcmFnbWVudCA9IGZyYWdtZW50KHsgbmFtZXNwYWNlQWxpYXM6IHsgd3A6IG5hbWVzcGFjZXMud3AgfSB9KVxyXG4gICAgLmVsZSgnQHdwJywgJ2lubGluZScpXHJcbiAgICAuYXR0KCdkaXN0QicsICcwJylcclxuICAgIC5hdHQoJ2Rpc3RMJywgJzAnKVxyXG4gICAgLmF0dCgnZGlzdFInLCAnMCcpXHJcbiAgICAuYXR0KCdkaXN0VCcsICcwJyk7XHJcblxyXG4gIGNvbnN0IGV4dGVudEZyYWdtZW50ID0gYnVpbGRFeHRlbnQoeyB3aWR0aDogYXR0cmlidXRlcy53aWR0aCwgaGVpZ2h0OiBhdHRyaWJ1dGVzLmhlaWdodCB9KTtcclxuICBpbmxpbmVEcmF3aW5nRnJhZ21lbnQuaW1wb3J0KGV4dGVudEZyYWdtZW50KTtcclxuICBjb25zdCBlZmZlY3RFeHRlbnRGcmFnbWVudCA9IGJ1aWxkRWZmZWN0RXh0ZW50RnJhZ21lbnQoKTtcclxuICBpbmxpbmVEcmF3aW5nRnJhZ21lbnQuaW1wb3J0KGVmZmVjdEV4dGVudEZyYWdtZW50KTtcclxuICBjb25zdCBkcmF3aW5nT2JqZWN0Tm9uVmlzdWFsUHJvcGVydGllc0ZyYWdtZW50ID0gYnVpbGREcmF3aW5nT2JqZWN0Tm9uVmlzdWFsUHJvcGVydGllcyhcclxuICAgIGF0dHJpYnV0ZXMuaWQsXHJcbiAgICBhdHRyaWJ1dGVzLmZpbGVOYW1lV2l0aEV4dGVuc2lvblxyXG4gICk7XHJcbiAgaW5saW5lRHJhd2luZ0ZyYWdtZW50LmltcG9ydChkcmF3aW5nT2JqZWN0Tm9uVmlzdWFsUHJvcGVydGllc0ZyYWdtZW50KTtcclxuICBjb25zdCBncmFwaGljRnJhZ21lbnQgPSBidWlsZEdyYXBoaWMoZ3JhcGhpY1R5cGUsIGF0dHJpYnV0ZXMpO1xyXG4gIGlubGluZURyYXdpbmdGcmFnbWVudC5pbXBvcnQoZ3JhcGhpY0ZyYWdtZW50KTtcclxuXHJcbiAgaW5saW5lRHJhd2luZ0ZyYWdtZW50LnVwKCk7XHJcblxyXG4gIHJldHVybiBpbmxpbmVEcmF3aW5nRnJhZ21lbnQ7XHJcbn07XHJcblxyXG5jb25zdCBidWlsZERyYXdpbmcgPSAoaW5saW5lT3JBbmNob3JlZCA9IGZhbHNlLCBncmFwaGljVHlwZSwgYXR0cmlidXRlcykgPT4ge1xyXG4gIGNvbnN0IGRyYXdpbmdGcmFnbWVudCA9IGZyYWdtZW50KHsgbmFtZXNwYWNlQWxpYXM6IHsgdzogbmFtZXNwYWNlcy53IH0gfSkuZWxlKCdAdycsICdkcmF3aW5nJyk7XHJcbiAgY29uc3QgaW5saW5lT3JBbmNob3JlZERyYXdpbmdGcmFnbWVudCA9IGlubGluZU9yQW5jaG9yZWRcclxuICAgID8gYnVpbGRJbmxpbmVEcmF3aW5nKGdyYXBoaWNUeXBlLCBhdHRyaWJ1dGVzKVxyXG4gICAgOiBidWlsZEFuY2hvcmVkRHJhd2luZyhncmFwaGljVHlwZSwgYXR0cmlidXRlcyk7XHJcbiAgZHJhd2luZ0ZyYWdtZW50LmltcG9ydChpbmxpbmVPckFuY2hvcmVkRHJhd2luZ0ZyYWdtZW50KTtcclxuICBkcmF3aW5nRnJhZ21lbnQudXAoKTtcclxuXHJcbiAgcmV0dXJuIGRyYXdpbmdGcmFnbWVudDtcclxufTtcclxuXHJcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb25zaXN0ZW50LXJldHVybiwgbm8tc2hhZG93XHJcbmNvbnN0IGJ1aWxkSW1hZ2UgPSBhc3luYyAoZG9jeERvY3VtZW50SW5zdGFuY2UsIHZOb2RlLCBtYXhpbXVtV2lkdGggPSBudWxsKSA9PiB7XHJcbiAgbGV0IHJlc3BvbnNlID0gbnVsbDtcclxuICBsZXQgYmFzZTY0VXJpID0gbnVsbDtcclxuICB0cnkge1xyXG4gICAgY29uc3QgaW1hZ2VTb3VyY2UgPSB2Tm9kZS5wcm9wZXJ0aWVzLnNyYztcclxuICAgIGlmIChpc1ZhbGlkVXJsKGltYWdlU291cmNlKSkge1xyXG4gICAgICBjb25zdCBiYXNlNjRTdHJpbmcgPSBhd2FpdCBpbWFnZVRvQmFzZTY0KGltYWdlU291cmNlKS5jYXRjaCgoZXJyb3IpID0+IHtcclxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxyXG4gICAgICAgIGNvbnNvbGUud2FybmluZyhgc2tpcHBpbmcgaW1hZ2UgZG93bmxvYWQgYW5kIGNvbnZlcnNpb24gZHVlIHRvICR7ZXJyb3J9YCk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgaWYgKGJhc2U2NFN0cmluZykge1xyXG4gICAgICAgIGJhc2U2NFVyaSA9IGBkYXRhOiR7bWltZVR5cGVzLmxvb2t1cChpbWFnZVNvdXJjZSl9O2Jhc2U2NCwgJHtiYXNlNjRTdHJpbmd9YDtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgYmFzZTY0VXJpID0gZGVjb2RlVVJJQ29tcG9uZW50KHZOb2RlLnByb3BlcnRpZXMuc3JjKTtcclxuICAgIH1cclxuICAgIGlmIChiYXNlNjRVcmkpIHtcclxuICAgICAgcmVzcG9uc2UgPSBkb2N4RG9jdW1lbnRJbnN0YW5jZS5jcmVhdGVNZWRpYUZpbGUoYmFzZTY0VXJpKTtcclxuICAgIH1cclxuICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgLy8gTk9PUFxyXG4gIH1cclxuICBpZiAocmVzcG9uc2UpIHtcclxuICAgIGRvY3hEb2N1bWVudEluc3RhbmNlLnppcFxyXG4gICAgICAuZm9sZGVyKCd3b3JkJylcclxuICAgICAgLmZvbGRlcignbWVkaWEnKVxyXG4gICAgICAuZmlsZShyZXNwb25zZS5maWxlTmFtZVdpdGhFeHRlbnNpb24sIEJ1ZmZlci5mcm9tKHJlc3BvbnNlLmZpbGVDb250ZW50LCAnYmFzZTY0JyksIHtcclxuICAgICAgICBjcmVhdGVGb2xkZXJzOiBmYWxzZSxcclxuICAgICAgfSk7XHJcblxyXG4gICAgY29uc3QgZG9jdW1lbnRSZWxzSWQgPSBkb2N4RG9jdW1lbnRJbnN0YW5jZS5jcmVhdGVEb2N1bWVudFJlbGF0aW9uc2hpcHMoXHJcbiAgICAgIGRvY3hEb2N1bWVudEluc3RhbmNlLnJlbGF0aW9uc2hpcEZpbGVuYW1lLFxyXG4gICAgICBpbWFnZVR5cGUsXHJcbiAgICAgIGBtZWRpYS8ke3Jlc3BvbnNlLmZpbGVOYW1lV2l0aEV4dGVuc2lvbn1gLFxyXG4gICAgICBpbnRlcm5hbFJlbGF0aW9uc2hpcFxyXG4gICAgKTtcclxuXHJcbiAgICBjb25zdCBpbWFnZUJ1ZmZlciA9IEJ1ZmZlci5mcm9tKHJlc3BvbnNlLmZpbGVDb250ZW50LCAnYmFzZTY0Jyk7XHJcbiAgICBjb25zdCBpbWFnZVByb3BlcnRpZXMgPSBzaXplT2YoaW1hZ2VCdWZmZXIpO1xyXG5cclxuICAgIGNvbnN0IGltYWdlRnJhZ21lbnQgPSBhd2FpdCB4bWxCdWlsZGVyLmJ1aWxkUGFyYWdyYXBoKFxyXG4gICAgICB2Tm9kZSxcclxuICAgICAge1xyXG4gICAgICAgIHR5cGU6ICdwaWN0dXJlJyxcclxuICAgICAgICBpbmxpbmVPckFuY2hvcmVkOiB0cnVlLFxyXG4gICAgICAgIHJlbGF0aW9uc2hpcElkOiBkb2N1bWVudFJlbHNJZCxcclxuICAgICAgICAuLi5yZXNwb25zZSxcclxuICAgICAgICBtYXhpbXVtV2lkdGg6IG1heGltdW1XaWR0aCB8fCBkb2N4RG9jdW1lbnRJbnN0YW5jZS5hdmFpbGFibGVEb2N1bWVudFNwYWNlLFxyXG4gICAgICAgIG9yaWdpbmFsV2lkdGg6IGltYWdlUHJvcGVydGllcy53aWR0aCxcclxuICAgICAgICBvcmlnaW5hbEhlaWdodDogaW1hZ2VQcm9wZXJ0aWVzLmhlaWdodCxcclxuICAgICAgfSxcclxuICAgICAgZG9jeERvY3VtZW50SW5zdGFuY2VcclxuICAgICk7XHJcblxyXG4gICAgcmV0dXJuIGltYWdlRnJhZ21lbnQ7XHJcbiAgfVxyXG59O1xyXG5cclxuY29uc3QgYnVpbGRMaXN0ID0gYXN5bmMgKHZOb2RlLCBkb2N4RG9jdW1lbnRJbnN0YW5jZSwgeG1sRnJhZ21lbnQpID0+IHtcclxuICBjb25zdCBsaXN0RWxlbWVudHMgPSBbXTtcclxuXHJcbiAgbGV0IHZOb2RlT2JqZWN0cyA9IFtcclxuICAgIHtcclxuICAgICAgbm9kZTogdk5vZGUsXHJcbiAgICAgIGxldmVsOiAwLFxyXG4gICAgICB0eXBlOiB2Tm9kZS50YWdOYW1lLFxyXG4gICAgICBudW1iZXJpbmdJZDogZG9jeERvY3VtZW50SW5zdGFuY2UuY3JlYXRlTnVtYmVyaW5nKHZOb2RlLnRhZ05hbWUsIHZOb2RlLnByb3BlcnRpZXMpLFxyXG4gICAgfSxcclxuICBdO1xyXG4gIHdoaWxlICh2Tm9kZU9iamVjdHMubGVuZ3RoKSB7XHJcbiAgICBjb25zdCB0ZW1wVk5vZGVPYmplY3QgPSB2Tm9kZU9iamVjdHMuc2hpZnQoKTtcclxuXHJcbiAgICBpZiAoXHJcbiAgICAgIGlzVlRleHQodGVtcFZOb2RlT2JqZWN0Lm5vZGUpIHx8XHJcbiAgICAgIChpc1ZOb2RlKHRlbXBWTm9kZU9iamVjdC5ub2RlKSAmJiAhWyd1bCcsICdvbCcsICdsaSddLmluY2x1ZGVzKHRlbXBWTm9kZU9iamVjdC5ub2RlLnRhZ05hbWUpKVxyXG4gICAgKSB7XHJcbiAgICAgIGNvbnN0IHBhcmFncmFwaEZyYWdtZW50ID0gYXdhaXQgeG1sQnVpbGRlci5idWlsZFBhcmFncmFwaChcclxuICAgICAgICB0ZW1wVk5vZGVPYmplY3Qubm9kZSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBudW1iZXJpbmc6IHsgbGV2ZWxJZDogdGVtcFZOb2RlT2JqZWN0LmxldmVsLCBudW1iZXJpbmdJZDogdGVtcFZOb2RlT2JqZWN0Lm51bWJlcmluZ0lkIH0sXHJcbiAgICAgICAgfSxcclxuICAgICAgICBkb2N4RG9jdW1lbnRJbnN0YW5jZVxyXG4gICAgICApO1xyXG5cclxuICAgICAgeG1sRnJhZ21lbnQuaW1wb3J0KHBhcmFncmFwaEZyYWdtZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoXHJcbiAgICAgIHRlbXBWTm9kZU9iamVjdC5ub2RlLmNoaWxkcmVuICYmXHJcbiAgICAgIHRlbXBWTm9kZU9iamVjdC5ub2RlLmNoaWxkcmVuLmxlbmd0aCAmJlxyXG4gICAgICBbJ3VsJywgJ29sJywgJ2xpJ10uaW5jbHVkZXModGVtcFZOb2RlT2JqZWN0Lm5vZGUudGFnTmFtZSlcclxuICAgICkge1xyXG4gICAgICBjb25zdCB0ZW1wVk5vZGVPYmplY3RzID0gdGVtcFZOb2RlT2JqZWN0Lm5vZGUuY2hpbGRyZW4ucmVkdWNlKChhY2N1bXVsYXRvciwgY2hpbGRWTm9kZSkgPT4ge1xyXG4gICAgICAgIGlmIChbJ3VsJywgJ29sJ10uaW5jbHVkZXMoY2hpbGRWTm9kZS50YWdOYW1lKSkge1xyXG4gICAgICAgICAgYWNjdW11bGF0b3IucHVzaCh7XHJcbiAgICAgICAgICAgIG5vZGU6IGNoaWxkVk5vZGUsXHJcbiAgICAgICAgICAgIGxldmVsOiB0ZW1wVk5vZGVPYmplY3QubGV2ZWwgKyAxLFxyXG4gICAgICAgICAgICB0eXBlOiBjaGlsZFZOb2RlLnRhZ05hbWUsXHJcbiAgICAgICAgICAgIG51bWJlcmluZ0lkOiBkb2N4RG9jdW1lbnRJbnN0YW5jZS5jcmVhdGVOdW1iZXJpbmcoXHJcbiAgICAgICAgICAgICAgY2hpbGRWTm9kZS50YWdOYW1lLFxyXG4gICAgICAgICAgICAgIGNoaWxkVk5vZGUucHJvcGVydGllc1xyXG4gICAgICAgICAgICApLFxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1sb25lbHktaWZcclxuICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgYWNjdW11bGF0b3IubGVuZ3RoID4gMCAmJlxyXG4gICAgICAgICAgICBpc1ZOb2RlKGFjY3VtdWxhdG9yW2FjY3VtdWxhdG9yLmxlbmd0aCAtIDFdLm5vZGUpICYmXHJcbiAgICAgICAgICAgIGFjY3VtdWxhdG9yW2FjY3VtdWxhdG9yLmxlbmd0aCAtIDFdLm5vZGUudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSAncCdcclxuICAgICAgICAgICkge1xyXG4gICAgICAgICAgICBhY2N1bXVsYXRvclthY2N1bXVsYXRvci5sZW5ndGggLSAxXS5ub2RlLmNoaWxkcmVuLnB1c2goY2hpbGRWTm9kZSk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBwYXJhZ3JhcGhWTm9kZSA9IG5ldyBWTm9kZShcclxuICAgICAgICAgICAgICAncCcsXHJcbiAgICAgICAgICAgICAgbnVsbCxcclxuICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmVzdGVkLXRlcm5hcnlcclxuICAgICAgICAgICAgICBpc1ZUZXh0KGNoaWxkVk5vZGUpXHJcbiAgICAgICAgICAgICAgICA/IFtjaGlsZFZOb2RlXVxyXG4gICAgICAgICAgICAgICAgOiAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmVzdGVkLXRlcm5hcnlcclxuICAgICAgICAgICAgICAgIGlzVk5vZGUoY2hpbGRWTm9kZSlcclxuICAgICAgICAgICAgICAgICAgPyBjaGlsZFZOb2RlLnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2xpJ1xyXG4gICAgICAgICAgICAgICAgICAgID8gWy4uLmNoaWxkVk5vZGUuY2hpbGRyZW5dXHJcbiAgICAgICAgICAgICAgICAgICAgOiBbY2hpbGRWTm9kZV1cclxuICAgICAgICAgICAgICAgICAgOiBbXVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICBhY2N1bXVsYXRvci5wdXNoKHtcclxuICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJldHRpZXIvcHJldHRpZXIsIG5vLW5lc3RlZC10ZXJuYXJ5XHJcbiAgICAgICAgICAgICAgbm9kZTogaXNWTm9kZShjaGlsZFZOb2RlKVxyXG4gICAgICAgICAgICAgICAgPyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJldHRpZXIvcHJldHRpZXIsIG5vLW5lc3RlZC10ZXJuYXJ5XHJcbiAgICAgICAgICAgICAgICBjaGlsZFZOb2RlLnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2xpJ1xyXG4gICAgICAgICAgICAgICAgICA/IGNoaWxkVk5vZGVcclxuICAgICAgICAgICAgICAgICAgOiBjaGlsZFZOb2RlLnRhZ05hbWUudG9Mb3dlckNhc2UoKSAhPT0gJ3AnXHJcbiAgICAgICAgICAgICAgICAgICAgPyBwYXJhZ3JhcGhWTm9kZVxyXG4gICAgICAgICAgICAgICAgICAgIDogY2hpbGRWTm9kZVxyXG4gICAgICAgICAgICAgICAgOiAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJldHRpZXIvcHJldHRpZXJcclxuICAgICAgICAgICAgICAgIHBhcmFncmFwaFZOb2RlLFxyXG4gICAgICAgICAgICAgIGxldmVsOiB0ZW1wVk5vZGVPYmplY3QubGV2ZWwsXHJcbiAgICAgICAgICAgICAgdHlwZTogdGVtcFZOb2RlT2JqZWN0LnR5cGUsXHJcbiAgICAgICAgICAgICAgbnVtYmVyaW5nSWQ6IHRlbXBWTm9kZU9iamVjdC5udW1iZXJpbmdJZCxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gYWNjdW11bGF0b3I7XHJcbiAgICAgIH0sIFtdKTtcclxuICAgICAgdk5vZGVPYmplY3RzID0gdGVtcFZOb2RlT2JqZWN0cy5jb25jYXQodk5vZGVPYmplY3RzKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJldHVybiBsaXN0RWxlbWVudHM7XHJcbn07XHJcblxyXG5leHBvcnQge1xyXG4gIGJ1aWxkUGFyYWdyYXBoLFxyXG4gIGJ1aWxkVGFibGUsXHJcbiAgYnVpbGROdW1iZXJpbmdJbnN0YW5jZXMsXHJcbiAgYnVpbGRMaW5lQnJlYWssXHJcbiAgYnVpbGRJbmRlbnRhdGlvbixcclxuICBidWlsZFRleHRFbGVtZW50LFxyXG4gIGJ1aWxkQm9sZCxcclxuICBidWlsZEl0YWxpY3MsXHJcbiAgYnVpbGRVbmRlcmxpbmUsXHJcbiAgYnVpbGREcmF3aW5nLFxyXG4gIGZpeHVwTGluZUhlaWdodCxcclxuICBidWlsZEltYWdlLFxyXG4gIGJ1aWxkTGlzdFxyXG59OyJdfQ==