css-to-tailwind-react 0.1.1 → 0.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.
- package/dist/cssParser.d.ts +11 -3
- package/dist/cssParser.js +195 -72
- package/dist/index.d.ts +5 -1
- package/dist/index.js +28 -2
- package/dist/jsxDescendantTransformer.d.ts +18 -0
- package/dist/jsxDescendantTransformer.js +324 -0
- package/dist/transformer.js +61 -61
- package/dist/utils/descendantSelectorResolver.d.ts +20 -0
- package/dist/utils/descendantSelectorResolver.js +186 -0
- package/dist/utils/pseudoSelectorResolver.d.ts +17 -0
- package/dist/utils/pseudoSelectorResolver.js +163 -0
- package/dist/utils/variantAssembler.d.ts +20 -0
- package/dist/utils/variantAssembler.js +114 -0
- package/package.json +1 -1
package/dist/cssParser.d.ts
CHANGED
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
import { TailwindMapper, CSSProperty } from './tailwindMapper';
|
|
2
2
|
export interface UtilityWithVariant {
|
|
3
3
|
value: string;
|
|
4
|
-
|
|
4
|
+
variants: string[];
|
|
5
|
+
}
|
|
6
|
+
export interface SelectorTarget {
|
|
7
|
+
type: 'class' | 'element';
|
|
8
|
+
name: string;
|
|
5
9
|
}
|
|
6
10
|
export interface CSSRule {
|
|
7
11
|
selector: string;
|
|
@@ -9,11 +13,13 @@ export interface CSSRule {
|
|
|
9
13
|
declarations: CSSProperty[];
|
|
10
14
|
convertedClasses: string[];
|
|
11
15
|
utilities: UtilityWithVariant[];
|
|
12
|
-
breakpoint?: string;
|
|
13
16
|
skipped: boolean;
|
|
14
17
|
fullyConverted: boolean;
|
|
15
18
|
partialConversion: boolean;
|
|
16
19
|
reason?: string;
|
|
20
|
+
isDescendant: boolean;
|
|
21
|
+
parentSelector?: SelectorTarget;
|
|
22
|
+
targetSelector?: SelectorTarget;
|
|
17
23
|
}
|
|
18
24
|
export interface CSSParseResult {
|
|
19
25
|
css: string;
|
|
@@ -29,7 +35,9 @@ export declare class CSSParser {
|
|
|
29
35
|
private mapper;
|
|
30
36
|
private breakpoints;
|
|
31
37
|
constructor(mapper: TailwindMapper, screens?: Record<string, string | [string, string]>);
|
|
32
|
-
private
|
|
38
|
+
private convertDeclarations;
|
|
39
|
+
private processSimpleRule;
|
|
40
|
+
private processDescendantRule;
|
|
33
41
|
parse(css: string, filePath: string): Promise<CSSParseResult>;
|
|
34
42
|
parseInternalStyle(html: string): {
|
|
35
43
|
styles: Array<{
|
package/dist/cssParser.js
CHANGED
|
@@ -8,6 +8,9 @@ const postcss_1 = __importDefault(require("postcss"));
|
|
|
8
8
|
const postcss_safe_parser_1 = __importDefault(require("postcss-safe-parser"));
|
|
9
9
|
const logger_1 = require("./utils/logger");
|
|
10
10
|
const breakpointResolver_1 = require("./utils/breakpointResolver");
|
|
11
|
+
const pseudoSelectorResolver_1 = require("./utils/pseudoSelectorResolver");
|
|
12
|
+
const descendantSelectorResolver_1 = require("./utils/descendantSelectorResolver");
|
|
13
|
+
const variantAssembler_1 = require("./utils/variantAssembler");
|
|
11
14
|
class CSSParser {
|
|
12
15
|
constructor(mapper, screens) {
|
|
13
16
|
this.mapper = mapper;
|
|
@@ -15,15 +18,35 @@ class CSSParser {
|
|
|
15
18
|
? (0, breakpointResolver_1.resolveBreakpointsFromConfig)(screens)
|
|
16
19
|
: (0, breakpointResolver_1.getBreakpoints)();
|
|
17
20
|
}
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
21
|
+
convertDeclarations(declarations) {
|
|
22
|
+
const conversionResults = [];
|
|
23
|
+
const conversionWarnings = [];
|
|
24
|
+
declarations.forEach(decl => {
|
|
25
|
+
const result = this.mapper.convertProperty(decl.property, decl.value);
|
|
26
|
+
conversionResults.push({
|
|
27
|
+
declaration: decl,
|
|
28
|
+
converted: !result.skipped && result.className !== null,
|
|
29
|
+
className: result.className
|
|
30
|
+
});
|
|
31
|
+
if (result.skipped && result.reason) {
|
|
32
|
+
conversionWarnings.push(result.reason);
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
const utilities = conversionResults
|
|
36
|
+
.filter(r => r.converted && r.className)
|
|
37
|
+
.map(r => ({
|
|
38
|
+
value: r.className,
|
|
39
|
+
variants: []
|
|
40
|
+
}));
|
|
41
|
+
return { utilities, conversionResults, conversionWarnings };
|
|
42
|
+
}
|
|
43
|
+
processSimpleRule(rule, additionalVariants = []) {
|
|
44
|
+
const selector = rule.selector;
|
|
45
|
+
const parsedSelectors = (0, pseudoSelectorResolver_1.parseMultipleSelectors)(selector);
|
|
46
|
+
const validSelectors = parsedSelectors.filter(s => !s.isComplex && s.baseClass);
|
|
47
|
+
if (validSelectors.length === 0) {
|
|
24
48
|
return null;
|
|
25
49
|
}
|
|
26
|
-
const className = classNameMatch[1];
|
|
27
50
|
const declarations = [];
|
|
28
51
|
rule.walkDecls((decl) => {
|
|
29
52
|
if (decl.prop.startsWith('--')) {
|
|
@@ -40,39 +63,85 @@ class CSSParser {
|
|
|
40
63
|
if (declarations.length === 0) {
|
|
41
64
|
return null;
|
|
42
65
|
}
|
|
43
|
-
const conversionResults =
|
|
44
|
-
const
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
66
|
+
const { utilities, conversionResults, conversionWarnings } = this.convertDeclarations(declarations);
|
|
67
|
+
const utilitiesWithVariants = utilities.map(u => ({
|
|
68
|
+
value: u.value,
|
|
69
|
+
variants: (0, variantAssembler_1.normalizeVariantOrder)([...u.variants, ...additionalVariants])
|
|
70
|
+
}));
|
|
71
|
+
const cssRules = [];
|
|
72
|
+
const allConversionResults = [];
|
|
73
|
+
for (const parsed of validSelectors) {
|
|
74
|
+
const pseudoVariants = parsed.pseudos || [];
|
|
75
|
+
const allVariants = (0, variantAssembler_1.normalizeVariantOrder)([...pseudoVariants, ...additionalVariants]);
|
|
76
|
+
const utilitiesForSelector = utilities.map(u => ({
|
|
77
|
+
value: u.value,
|
|
78
|
+
variants: allVariants
|
|
79
|
+
}));
|
|
80
|
+
const convertedClasses = (0, variantAssembler_1.assembleUtilities)(utilitiesForSelector);
|
|
81
|
+
const allDeclarationsConverted = conversionResults.every(r => r.converted);
|
|
82
|
+
const someDeclarationsConverted = convertedClasses.length > 0;
|
|
83
|
+
const cssRule = {
|
|
84
|
+
selector: selector,
|
|
85
|
+
className: parsed.baseClass,
|
|
86
|
+
declarations,
|
|
87
|
+
convertedClasses,
|
|
88
|
+
utilities: utilitiesForSelector,
|
|
89
|
+
skipped: !someDeclarationsConverted,
|
|
90
|
+
fullyConverted: allDeclarationsConverted,
|
|
91
|
+
partialConversion: someDeclarationsConverted && !allDeclarationsConverted,
|
|
92
|
+
reason: !someDeclarationsConverted ? 'No convertible declarations' : undefined,
|
|
93
|
+
isDescendant: false
|
|
94
|
+
};
|
|
95
|
+
cssRules.push(cssRule);
|
|
96
|
+
allConversionResults.push(conversionResults);
|
|
97
|
+
}
|
|
98
|
+
return { cssRules, conversionResults: allConversionResults, conversionWarnings };
|
|
99
|
+
}
|
|
100
|
+
processDescendantRule(rule, additionalVariants = []) {
|
|
101
|
+
const selector = rule.selector;
|
|
102
|
+
const parsed = (0, descendantSelectorResolver_1.parseDescendantSelector)(selector);
|
|
103
|
+
if (parsed.isComplex || !parsed.parent) {
|
|
104
|
+
return null;
|
|
105
|
+
}
|
|
106
|
+
const declarations = [];
|
|
107
|
+
rule.walkDecls((decl) => {
|
|
108
|
+
if (decl.prop.startsWith('--')) {
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
if (decl.value.includes('calc(')) {
|
|
112
|
+
return;
|
|
54
113
|
}
|
|
114
|
+
declarations.push({
|
|
115
|
+
property: decl.prop,
|
|
116
|
+
value: decl.value
|
|
117
|
+
});
|
|
55
118
|
});
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
119
|
+
if (declarations.length === 0) {
|
|
120
|
+
return null;
|
|
121
|
+
}
|
|
122
|
+
const { utilities, conversionResults, conversionWarnings } = this.convertDeclarations(declarations);
|
|
123
|
+
const utilitiesWithVariants = utilities.map(u => ({
|
|
124
|
+
value: u.value,
|
|
125
|
+
variants: (0, variantAssembler_1.normalizeVariantOrder)([...u.variants, ...additionalVariants])
|
|
61
126
|
}));
|
|
62
|
-
const convertedClasses =
|
|
127
|
+
const convertedClasses = (0, variantAssembler_1.assembleUtilities)(utilitiesWithVariants);
|
|
63
128
|
const allDeclarationsConverted = conversionResults.every(r => r.converted);
|
|
64
129
|
const someDeclarationsConverted = convertedClasses.length > 0;
|
|
130
|
+
const className = parsed.parent.type === 'class' ? parsed.parent.name : '';
|
|
131
|
+
const targetName = parsed.target.type === 'class' ? `.${parsed.target.name}` : parsed.target.name;
|
|
65
132
|
const cssRule = {
|
|
66
|
-
selector:
|
|
133
|
+
selector: selector,
|
|
67
134
|
className,
|
|
68
135
|
declarations,
|
|
69
136
|
convertedClasses,
|
|
70
|
-
utilities,
|
|
71
|
-
breakpoint,
|
|
137
|
+
utilities: utilitiesWithVariants,
|
|
72
138
|
skipped: !someDeclarationsConverted,
|
|
73
139
|
fullyConverted: allDeclarationsConverted,
|
|
74
140
|
partialConversion: someDeclarationsConverted && !allDeclarationsConverted,
|
|
75
|
-
reason: !someDeclarationsConverted ? 'No convertible declarations' : undefined
|
|
141
|
+
reason: !someDeclarationsConverted ? 'No convertible declarations' : undefined,
|
|
142
|
+
isDescendant: true,
|
|
143
|
+
parentSelector: parsed.parent,
|
|
144
|
+
targetSelector: parsed.target
|
|
76
145
|
};
|
|
77
146
|
return { cssRule, conversionResults, conversionWarnings };
|
|
78
147
|
}
|
|
@@ -94,24 +163,24 @@ class CSSParser {
|
|
|
94
163
|
warnings.push(mediaResult.reason || `Skipped media query: ${atRule.params}`);
|
|
95
164
|
return;
|
|
96
165
|
}
|
|
97
|
-
const
|
|
166
|
+
const responsiveVariant = mediaResult.breakpoint;
|
|
98
167
|
const nestedRules = [];
|
|
99
168
|
atRule.walkRules((rule) => {
|
|
100
169
|
nestedRules.push(rule);
|
|
101
170
|
});
|
|
102
171
|
for (const rule of nestedRules) {
|
|
103
|
-
const
|
|
104
|
-
if (
|
|
105
|
-
rules.push(
|
|
106
|
-
warnings.push(...
|
|
107
|
-
if (
|
|
172
|
+
const descendantResult = this.processDescendantRule(rule, [responsiveVariant]);
|
|
173
|
+
if (descendantResult) {
|
|
174
|
+
rules.push(descendantResult.cssRule);
|
|
175
|
+
warnings.push(...descendantResult.conversionWarnings);
|
|
176
|
+
if (descendantResult.cssRule.convertedClasses.length > 0) {
|
|
108
177
|
hasChanges = true;
|
|
109
|
-
if (
|
|
178
|
+
if (descendantResult.cssRule.fullyConverted) {
|
|
110
179
|
rule.remove();
|
|
111
|
-
logger_1.logger.verbose(`Removed rule
|
|
180
|
+
logger_1.logger.verbose(`Removed descendant rule ${rule.selector} in @media → ${responsiveVariant}`);
|
|
112
181
|
}
|
|
113
182
|
else {
|
|
114
|
-
for (const cr of
|
|
183
|
+
for (const cr of descendantResult.conversionResults) {
|
|
115
184
|
if (cr.converted) {
|
|
116
185
|
rule.walkDecls((decl) => {
|
|
117
186
|
if (decl.prop === cr.declaration.property && decl.value === cr.declaration.value) {
|
|
@@ -120,9 +189,40 @@ class CSSParser {
|
|
|
120
189
|
});
|
|
121
190
|
}
|
|
122
191
|
}
|
|
123
|
-
logger_1.logger.verbose(`Partial conversion of
|
|
192
|
+
logger_1.logger.verbose(`Partial conversion of descendant rule in @media → ${responsiveVariant}`);
|
|
124
193
|
}
|
|
125
194
|
}
|
|
195
|
+
continue;
|
|
196
|
+
}
|
|
197
|
+
const simpleResult = this.processSimpleRule(rule, [responsiveVariant]);
|
|
198
|
+
if (simpleResult) {
|
|
199
|
+
rules.push(...simpleResult.cssRules);
|
|
200
|
+
warnings.push(...simpleResult.conversionWarnings);
|
|
201
|
+
const anyConverted = simpleResult.cssRules.some(r => r.convertedClasses.length > 0);
|
|
202
|
+
if (anyConverted) {
|
|
203
|
+
hasChanges = true;
|
|
204
|
+
const allFullyConverted = simpleResult.cssRules.every(r => r.fullyConverted);
|
|
205
|
+
if (allFullyConverted) {
|
|
206
|
+
rule.remove();
|
|
207
|
+
const classNames = simpleResult.cssRules.map(r => r.className).join(', .');
|
|
208
|
+
logger_1.logger.verbose(`Removed rule .${classNames} in @media (min-width) → ${responsiveVariant}`);
|
|
209
|
+
}
|
|
210
|
+
else {
|
|
211
|
+
for (const cr of simpleResult.conversionResults.flat()) {
|
|
212
|
+
if (cr.converted) {
|
|
213
|
+
rule.walkDecls((decl) => {
|
|
214
|
+
if (decl.prop === cr.declaration.property && decl.value === cr.declaration.value) {
|
|
215
|
+
decl.remove();
|
|
216
|
+
}
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
logger_1.logger.verbose(`Partial conversion in @media → ${responsiveVariant}`);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
else {
|
|
225
|
+
warnings.push(`Skipped rule in @media: ${rule.selector}`);
|
|
126
226
|
}
|
|
127
227
|
}
|
|
128
228
|
if (atRule.nodes && atRule.nodes.length === 0) {
|
|
@@ -134,42 +234,71 @@ class CSSParser {
|
|
|
134
234
|
if (rule.parent && rule.parent.type === 'atrule') {
|
|
135
235
|
return;
|
|
136
236
|
}
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
237
|
+
const descendantResult = this.processDescendantRule(rule);
|
|
238
|
+
if (descendantResult) {
|
|
239
|
+
rules.push(descendantResult.cssRule);
|
|
240
|
+
warnings.push(...descendantResult.conversionWarnings);
|
|
241
|
+
if (descendantResult.cssRule.convertedClasses.length > 0) {
|
|
242
|
+
hasChanges = true;
|
|
243
|
+
if (descendantResult.cssRule.fullyConverted) {
|
|
244
|
+
rule.remove();
|
|
245
|
+
logger_1.logger.verbose(`Removed descendant rule ${rule.selector}`);
|
|
246
|
+
}
|
|
247
|
+
else {
|
|
248
|
+
for (const cr of descendantResult.conversionResults) {
|
|
249
|
+
if (cr.converted) {
|
|
250
|
+
rule.walkDecls((decl) => {
|
|
251
|
+
if (decl.prop === cr.declaration.property && decl.value === cr.declaration.value) {
|
|
252
|
+
decl.remove();
|
|
253
|
+
}
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
logger_1.logger.verbose(`Partial conversion of descendant rule`);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
146
260
|
return;
|
|
147
261
|
}
|
|
148
|
-
const
|
|
149
|
-
if (!
|
|
262
|
+
const simpleResult = this.processSimpleRule(rule);
|
|
263
|
+
if (!simpleResult) {
|
|
264
|
+
const parsed = (0, descendantSelectorResolver_1.parseDescendantSelector)(rule.selector);
|
|
265
|
+
if (parsed.isComplex) {
|
|
266
|
+
warnings.push(parsed.reason || `Skipped complex selector: ${rule.selector}`);
|
|
267
|
+
logger_1.logger.verbose(`Skipping complex selector: ${rule.selector}`);
|
|
268
|
+
}
|
|
269
|
+
else {
|
|
270
|
+
const parsedSelectors = (0, pseudoSelectorResolver_1.parseMultipleSelectors)(rule.selector);
|
|
271
|
+
const allComplex = parsedSelectors.every(s => s.isComplex);
|
|
272
|
+
if (allComplex) {
|
|
273
|
+
const reasons = parsedSelectors.map(s => s.reason).filter(Boolean);
|
|
274
|
+
warnings.push(...reasons);
|
|
275
|
+
logger_1.logger.verbose(`Skipping complex selector: ${rule.selector}`);
|
|
276
|
+
}
|
|
277
|
+
}
|
|
150
278
|
return;
|
|
151
279
|
}
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
if (
|
|
280
|
+
rules.push(...simpleResult.cssRules);
|
|
281
|
+
warnings.push(...simpleResult.conversionWarnings);
|
|
282
|
+
const anyConverted = simpleResult.cssRules.some(r => r.convertedClasses.length > 0);
|
|
283
|
+
if (anyConverted) {
|
|
156
284
|
hasChanges = true;
|
|
157
|
-
|
|
285
|
+
const allFullyConverted = simpleResult.cssRules.every(r => r.fullyConverted);
|
|
286
|
+
if (allFullyConverted) {
|
|
158
287
|
rule.remove();
|
|
159
|
-
|
|
288
|
+
const classNames = simpleResult.cssRules.map(r => r.className).join(', .');
|
|
289
|
+
logger_1.logger.verbose(`Removed rule .${classNames} (all declarations converted)`);
|
|
160
290
|
}
|
|
161
291
|
else {
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
removedCount++;
|
|
292
|
+
for (const cr of simpleResult.conversionResults.flat()) {
|
|
293
|
+
if (cr.converted) {
|
|
294
|
+
rule.walkDecls((decl) => {
|
|
295
|
+
if (decl.prop === cr.declaration.property && decl.value === cr.declaration.value) {
|
|
296
|
+
decl.remove();
|
|
297
|
+
}
|
|
298
|
+
});
|
|
170
299
|
}
|
|
171
|
-
}
|
|
172
|
-
logger_1.logger.verbose(`Partial conversion of
|
|
300
|
+
}
|
|
301
|
+
logger_1.logger.verbose(`Partial conversion of rule`);
|
|
173
302
|
}
|
|
174
303
|
}
|
|
175
304
|
});
|
|
@@ -196,7 +325,6 @@ class CSSParser {
|
|
|
196
325
|
parseInternalStyle(html) {
|
|
197
326
|
const styles = [];
|
|
198
327
|
const warnings = [];
|
|
199
|
-
// Simple regex to find style tags (this is safe for finding tags, not for parsing content)
|
|
200
328
|
const styleRegex = /<style[^>]*>([\s\S]*?)<\/style>/gi;
|
|
201
329
|
let match;
|
|
202
330
|
while ((match = styleRegex.exec(html)) !== null) {
|
|
@@ -214,7 +342,6 @@ class CSSParser {
|
|
|
214
342
|
let modifiedHtml = html;
|
|
215
343
|
let hasChanges = false;
|
|
216
344
|
const { styles } = this.parseInternalStyle(html);
|
|
217
|
-
// Process styles in reverse order to preserve indices
|
|
218
345
|
for (let i = styles.length - 1; i >= 0; i--) {
|
|
219
346
|
const style = styles[i];
|
|
220
347
|
try {
|
|
@@ -224,11 +351,9 @@ class CSSParser {
|
|
|
224
351
|
if (result.hasChanges) {
|
|
225
352
|
hasChanges = true;
|
|
226
353
|
if (result.canDelete || result.css.trim() === '') {
|
|
227
|
-
// Remove entire style tag
|
|
228
354
|
modifiedHtml = modifiedHtml.slice(0, style.start) + modifiedHtml.slice(style.end);
|
|
229
355
|
}
|
|
230
356
|
else {
|
|
231
|
-
// Replace style content
|
|
232
357
|
const before = modifiedHtml.slice(0, style.start);
|
|
233
358
|
const after = modifiedHtml.slice(style.end);
|
|
234
359
|
const tagStart = html.slice(style.start).match(/<style[^>]*>/)?.[0] || '<style>';
|
|
@@ -251,13 +376,11 @@ class CSSParser {
|
|
|
251
376
|
}
|
|
252
377
|
extractImportPaths(code) {
|
|
253
378
|
const imports = [];
|
|
254
|
-
// Match CSS imports
|
|
255
379
|
const importRegex = /import\s+['"]([^'"]+\.css)['"];?/g;
|
|
256
380
|
let match;
|
|
257
381
|
while ((match = importRegex.exec(code)) !== null) {
|
|
258
382
|
imports.push(match[1]);
|
|
259
383
|
}
|
|
260
|
-
// Match require statements
|
|
261
384
|
const requireRegex = /require\s*\(\s*['"]([^'"]+\.css)['"]\s*\)/g;
|
|
262
385
|
while ((match = requireRegex.exec(code)) !== null) {
|
|
263
386
|
imports.push(match[1]);
|
|
@@ -266,4 +389,4 @@ class CSSParser {
|
|
|
266
389
|
}
|
|
267
390
|
}
|
|
268
391
|
exports.CSSParser = CSSParser;
|
|
269
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3NzUGFyc2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2Nzc1BhcnNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxzREFBbUU7QUFDbkUsOEVBQTZDO0FBRTdDLDJDQUF3QztBQUN4QyxtRUFPb0M7QUFnQ3BDLE1BQWEsU0FBUztJQUlwQixZQUFZLE1BQXNCLEVBQUUsT0FBbUQ7UUFDckYsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLFdBQVcsR0FBRyxPQUFPO1lBQ3hCLENBQUMsQ0FBQyxJQUFBLGlEQUE0QixFQUFDLE9BQU8sQ0FBQztZQUN2QyxDQUFDLENBQUMsSUFBQSxtQ0FBYyxHQUFFLENBQUM7SUFDdkIsQ0FBQztJQUVPLFdBQVcsQ0FDakIsSUFBVSxFQUNWLFVBQW1CO1FBRW5CLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNoQyxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFFRCxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO1FBQzdFLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUNwQixPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFFRCxNQUFNLFNBQVMsR0FBRyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEMsTUFBTSxZQUFZLEdBQWtCLEVBQUUsQ0FBQztRQUV2QyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDdEIsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUMvQixPQUFPO1lBQ1QsQ0FBQztZQUVELElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztnQkFDakMsT0FBTztZ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SyxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUNqRCxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3pCLENBQUM7UUFFRCwyQkFBMkI7UUFDM0IsTUFBTSxZQUFZLEdBQUcsNENBQTRDLENBQUM7UUFDbEUsT0FBTyxDQUFDLEtBQUssR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDbEQsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN6QixDQUFDO1FBRUQsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztDQUNGO0FBeFVELDhCQXdVQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBwb3N0Y3NzLCB7IFJvb3QsIFJ1bGUsIERlY2xhcmF0aW9uLCBBdFJ1bGUgfSBmcm9tICdwb3N0Y3NzJztcbmltcG9ydCBzYWZlUGFyc2VyIGZyb20gJ3Bvc3Rjc3Mtc2FmZS1wYXJzZXInO1xuaW1wb3J0IHsgVGFpbHdpbmRNYXBwZXIsIENTU1Byb3BlcnR5IH0gZnJvbSAnLi90YWlsd2luZE1hcHBlcic7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuL3V0aWxzL2xvZ2dlcic7XG5pbXBvcnQgeyBcbiAgQnJlYWtwb2ludCwgXG4gIGdldEJyZWFrcG9pbnRzLCBcbiAgcmVzb2x2ZUJyZWFrcG9pbnRzRnJvbUNvbmZpZyxcbiAgcHJvY2Vzc01lZGlhUXVlcnksIFxuICBwcmVmaXhXaXRoQnJlYWtwb2ludCxcbiAgY2xlYXJCcmVha3BvaW50Q2FjaGUgXG59IGZyb20gJy4vdXRpbHMvYnJlYWtwb2ludFJlc29sdmVyJztcblxuZXhwb3J0IGludGVyZmFjZSBVdGlsaXR5V2l0aFZhcmlhbnQge1xuICB2YWx1ZTogc3RyaW5nO1xuICB2YXJpYW50Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENTU1J1bGUge1xuICBzZWxlY3Rvcjogc3RyaW5nO1xuICBjbGFzc05hbWU6IHN0cmluZztcbiAgZGVjbGFyYXRpb25zOiBDU1NQcm9wZXJ0eVtdO1xuICBjb252ZXJ0ZWRDbGFzc2VzOiBzdHJpbmdbXTtcbiAgdXRpbGl0aWVzOiBVdGlsaXR5V2l0aFZhcmlhbnRbXTtcbiAgYnJlYWtwb2ludD86IHN0cmluZztcbiAgc2tpcHBlZDogYm9vbGVhbjtcbiAgZnVsbHlDb252ZXJ0ZWQ6IGJvb2xlYW47XG4gIHBhcnRpYWxDb252ZXJzaW9uOiBib29sZWFuO1xuICByZWFzb24/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ1NTUGFyc2VSZXN1bHQge1xuICBjc3M6IHN0cmluZztcbiAgcnVsZXM6IENTU1J1bGVbXTtcbiAgaGFzQ2hhbmdlczogYm9vbGVhbjtcbiAgY2FuRGVsZXRlOiBib29sZWFuO1xuICB3YXJuaW5nczogc3RyaW5nW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ1NTVXNhZ2VNYXAge1xuICBbY2xhc3NOYW1lOiBzdHJpbmddOiBzdHJpbmdbXTsgLy8gY2xhc3NOYW1lIC0+IGZpbGUgcGF0aHNcbn1cblxuZXhwb3J0IGNsYXNzIENTU1BhcnNlciB7XG4gIHByaXZhdGUgbWFwcGVyOiBUYWlsd2luZE1hcHBlcjtcbiAgcHJpdmF0ZSBicmVha3BvaW50czogQnJlYWtwb2ludFtdO1xuXG4gIGNvbnN0cnVjdG9yKG1hcHBlcjogVGFpbHdpbmRNYXBwZXIsIHNjcmVlbnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBbc3RyaW5nLCBzdHJpbmddPikge1xuICAgIHRoaXMubWFwcGVyID0gbWFwcGVyO1xuICAgIHRoaXMuYnJlYWtwb2ludHMgPSBzY3JlZW5zIFxuICAgICAgPyByZXNvbHZlQnJlYWtwb2ludHNGcm9tQ29uZmlnKHNjcmVlbnMpIFxuICAgICAgOiBnZXRCcmVha3BvaW50cygpO1xuICB9XG5cbiAgcHJpdmF0ZSBwcm9jZXNzUnVsZShcbiAgICBydWxlOiBSdWxlLFxuICAgIGJyZWFrcG9pbnQ/OiBzdHJpbmdcbiAgKTogeyBjc3NSdWxlOiBDU1NSdWxlOyBjb252ZXJzaW9uUmVzdWx0czogQXJyYXk8eyBkZWNsYXJhdGlvbjogQ1NTUHJvcGVydHk7IGNvbnZlcnRlZDogYm9vbGVhbjsgY2xhc3NOYW1lOiBzdHJpbmcgfCBudWxsIH0+OyBjb252ZXJzaW9uV2FybmluZ3M6IHN0cmluZ1tdIH0gfCBudWxsIHtcbiAgICBpZiAocnVsZS5zZWxlY3Rvci5pbmNsdWRlcygnOicpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBjbGFzc05hbWVNYXRjaCA9IHJ1bGUuc2VsZWN0b3IubWF0Y2goL15cXC4oW2EtekEtWl8tXVthLXpBLVowLTlfLV0qKSQvKTtcbiAgICBpZiAoIWNsYXNzTmFtZU1hdGNoKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBjbGFzc05hbWUgPSBjbGFzc05hbWVNYXRjaFsxXTtcbiAgICBjb25zdCBkZWNsYXJhdGlvbnM6IENTU1Byb3BlcnR5W10gPSBbXTtcblxuICAgIHJ1bGUud2Fsa0RlY2xzKChkZWNsKSA9PiB7XG4gICAgICBpZiAoZGVjbC5wcm9wLnN0YXJ0c1dpdGgoJy0tJykpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGVjbC52YWx1ZS5pbmNsdWRlcygnY2FsYygnKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGRlY2xhcmF0aW9ucy5wdXNoKHtcbiAgICAgICAgcHJvcGVydHk6IGRlY2wucHJvcCxcbiAgICAgICAgdmFsdWU6IGRlY2wudmFsdWVcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaWYgKGRlY2xhcmF0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbnZlcnNpb25SZXN1bHRzOiBBcnJheTx7XG4gICAgICBkZWNsYXJhdGlvbjogQ1NTUHJvcGVydHk7XG4gICAgICBjb252ZXJ0ZWQ6IGJvb2xlYW47XG4gICAgICBjbGFzc05hbWU6IHN0cmluZyB8IG51bGw7XG4gICAgfT4gPSBbXTtcbiAgICBjb25zdCBjb252ZXJzaW9uV2FybmluZ3M6IHN0cmluZ1tdID0gW107XG5cbiAgICBkZWNsYXJhdGlvbnMuZm9yRWFjaChkZWNsID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMubWFwcGVyLmNvbnZlcnRQcm9wZXJ0eShkZWNsLnByb3BlcnR5LCBkZWNsLnZhbHVlKTtcbiAgICAgIGNvbnZlcnNpb25SZXN1bHRzLnB1c2goe1xuICAgICAgICBkZWNsYXJhdGlvbjogZGVjbCxcbiAgICAgICAgY29udmVydGVkOiAhcmVzdWx0LnNraXBwZWQgJiYgcmVzdWx0LmNsYXNzTmFtZSAhPT0gbnVsbCxcbiAgICAgICAgY2xhc3NOYW1lOiByZXN1bHQuY2xhc3NOYW1lXG4gICAgICB9KTtcbiAgICAgIGlmIChyZXN1bHQuc2tpcHBlZCAmJiByZXN1bHQucmVhc29uKSB7XG4gICAgICAgIGNvbnZlcnNpb25XYXJuaW5ncy5wdXNoKHJlc3VsdC5yZWFzb24pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3QgdXRpbGl0aWVzOiBVdGlsaXR5V2l0aFZhcmlhbnRbXSA9IGNvbnZlcnNpb25SZXN1bHRzXG4gICAgICAuZmlsdGVyKHIgPT4gci5jb252ZXJ0ZWQgJiYgci5jbGFzc05hbWUpXG4gICAgICAubWFwKHIgPT4gKHtcbiAgICAgICAgdmFsdWU6IHIuY2xhc3NOYW1lISxcbiAgICAgICAgdmFyaWFudDogYnJlYWtwb2ludFxuICAgICAgfSkpO1xuXG4gICAgY29uc3QgY29udmVydGVkQ2xhc3NlcyA9IHV0aWxpdGllcy5tYXAodSA9PiBcbiAgICAgIHUudmFyaWFudCA/IHByZWZpeFdpdGhCcmVha3BvaW50KHUudmFsdWUsIHUudmFyaWFudCkgOiB1LnZhbHVlXG4gICAgKTtcblxuICAgIGNvbnN0IGFsbERlY2xhcmF0aW9uc0NvbnZlcnRlZCA9IGNvbnZlcnNpb25SZXN1bHRzLmV2ZXJ5KHIgPT4gci5jb252ZXJ0ZWQpO1xuICAgIGNvbnN0IHNvbWVEZWNsYXJhdGlvbnNDb252ZXJ0ZWQgPSBjb252ZXJ0ZWRDbGFzc2VzLmxlbmd0aCA+IDA7XG5cbiAgICBjb25zdCBjc3NSdWxlOiBDU1NSdWxlID0ge1xuICAgICAgc2VsZWN0b3I6IHJ1bGUuc2VsZWN0b3IsXG4gICAgICBjbGFzc05hbWUsXG4gICAgICBkZWNsYXJhdGlvbnMsXG4gICAgICBjb252ZXJ0ZWRDbGFzc2VzLFxuICAgICAgdXRpbGl0aWVzLFxuICAgICAgYnJlYWtwb2ludCxcbiAgICAgIHNraXBwZWQ6ICFzb21lRGVjbGFyYXRpb25zQ29udmVydGVkLFxuICAgICAgZnVsbHlDb252ZXJ0ZWQ6IGFsbERlY2xhcmF0aW9uc0NvbnZlcnRlZCxcbiAgICAgIHBhcnRpYWxDb252ZXJzaW9uOiBzb21lRGVjbGFyYXRpb25zQ29udmVydGVkICYmICFhbGxEZWNsYXJhdGlvbnNDb252ZXJ0ZWQsXG4gICAgICByZWFzb246ICFzb21lRGVjbGFyYXRpb25zQ29udmVydGVkID8gJ05vIGNvbnZlcnRpYmxlIGRlY2xhcmF0aW9ucycgOiB1bmRlZmluZWRcbiAgICB9O1xuXG4gICAgcmV0dXJuIHsgY3NzUnVsZSwgY29udmVyc2lvblJlc3VsdHMsIGNvbnZlcnNpb25XYXJuaW5ncyB9O1xuICB9XG5cbiAgYXN5bmMgcGFyc2UoY3NzOiBzdHJpbmcsIGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPENTU1BhcnNlUmVzdWx0PiB7XG4gICAgY29uc3QgcnVsZXM6IENTU1J1bGVbXSA9IFtdO1xuICAgIGNvbnN0IHdhcm5pbmdzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGxldCBoYXNDaGFuZ2VzID0gZmFsc2U7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qgcm9vdCA9IGF3YWl0IHBvc3Rjc3MoKS5wcm9jZXNzKGNzcywge1xuICAgICAgICBwYXJzZXI6IHNhZmVQYXJzZXIsXG4gICAgICAgIGZyb206IGZpbGVQYXRoXG4gICAgICB9KS50aGVuKHJlc3VsdCA9PiByZXN1bHQucm9vdCk7XG5cbiAgICAgIHJvb3Qud2Fsa0F0UnVsZXMoKGF0UnVsZSkgPT4ge1xuICAgICAgICBpZiAoYXRSdWxlLm5hbWUgIT09ICdtZWRpYScpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtZWRpYVJlc3VsdCA9IHByb2Nlc3NNZWRpYVF1ZXJ5KGF0UnVsZS5wYXJhbXMsIHRoaXMuYnJlYWtwb2ludHMpO1xuXG4gICAgICAgIGlmIChtZWRpYVJlc3VsdC5za2lwcGVkKSB7XG4gICAgICAgICAgd2FybmluZ3MucHVzaChtZWRpYVJlc3VsdC5yZWFzb24gfHwgYFNraXBwZWQgbWVkaWEgcXVlcnk6ICR7YXRSdWxlLnBhcmFtc31gKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBicmVha3BvaW50ID0gbWVkaWFSZXN1bHQuYnJlYWtwb2ludCE7XG5cbiAgICAgICAgY29uc3QgbmVzdGVkUnVsZXM6IFJ1bGVbXSA9IFtdO1xuICAgICAgICBhdFJ1bGUud2Fsa1J1bGVzKChydWxlKSA9PiB7XG4gICAgICAgICAgbmVzdGVkUnVsZXMucHVzaChydWxlKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZm9yIChjb25zdCBydWxlIG9mIG5lc3RlZFJ1bGVzKSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5wcm9jZXNzUnVsZShydWxlLCBicmVha3BvaW50KTtcbiAgICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICBydWxlcy5wdXNoKHJlc3VsdC5jc3NSdWxlKTtcbiAgICAgICAgICAgIHdhcm5pbmdzLnB1c2goLi4ucmVzdWx0LmNvbnZlcnNpb25XYXJuaW5ncyk7XG5cbiAgICAgICAgICAgIGlmIChyZXN1bHQuY3NzUnVsZS5jb252ZXJ0ZWRDbGFzc2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgaGFzQ2hhbmdlcyA9IHRydWU7XG5cbiAgICAgICAgICAgICAgaWYgKHJlc3VsdC5jc3NSdWxlLmZ1bGx5Q29udmVydGVkKSB7XG4gICAgICAgICAgICAgICAgcnVsZS5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICBsb2dnZXIudmVyYm9zZShgUmVtb3ZlZCBydWxlIC4ke3Jlc3VsdC5jc3NSdWxlLmNsYXNzTmFtZX0gaW4gQG1lZGlhIChtaW4td2lkdGgpIOKGkiAke2JyZWFrcG9pbnR9YCk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBjciBvZiByZXN1bHQuY29udmVyc2lvblJlc3VsdHMpIHtcbiAgICAgICAgICAgICAgICAgIGlmIChjci5jb252ZXJ0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcnVsZS53YWxrRGVjbHMoKGRlY2wpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVjbC5wcm9wID09PSBjci5kZWNsYXJhdGlvbi5wcm9wZXJ0eSAmJiBkZWNsLnZhbHVlID09PSBjci5kZWNsYXJhdGlvbi52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVjbC5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsb2dnZXIudmVyYm9zZShgUGFydGlhbCBjb252ZXJzaW9uIG9mIC4ke3Jlc3VsdC5jc3NSdWxlLmNsYXNzTmFtZX0gaW4gQG1lZGlhIOKGkiAke2JyZWFrcG9pbnR9YCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYXRSdWxlLm5vZGVzICYmIGF0UnVsZS5ub2Rlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBhdFJ1bGUucmVtb3ZlKCk7XG4gICAgICAgICAgbG9nZ2VyLnZlcmJvc2UoYFJlbW92ZWQgZW1wdHkgQG1lZGlhIHJ1bGVgKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHJvb3Qud2Fsa1J1bGVzKChydWxlKSA9PiB7XG4gICAgICAgIGlmIChydWxlLnBhcmVudCAmJiBydWxlLnBhcmVudC50eXBlID09PSAnYXRydWxlJykge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChydWxlLnNlbGVjdG9yLmluY2x1ZGVzKCc6JykpIHtcbiAgICAgICAgICB3YXJuaW5ncy5wdXNoKGBTa2lwcGVkIHBzZXVkby1zZWxlY3RvcjogJHtydWxlLnNlbGVjdG9yfWApO1xuICAgICAgICAgIGxvZ2dlci52ZXJib3NlKGBTa2lwcGluZyBwc2V1ZG8tc2VsZWN0b3I6ICR7cnVsZS5zZWxlY3Rvcn1gKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjbGFzc05hbWVNYXRjaCA9IHJ1bGUuc2VsZWN0b3IubWF0Y2goL15cXC4oW2EtekEtWl8tXVthLXpBLVowLTlfLV0qKSQvKTtcbiAgICAgICAgaWYgKCFjbGFzc05hbWVNYXRjaCkge1xuICAgICAgICAgIHdhcm5pbmdzLnB1c2goYFNraXBwZWQgY29tcGxleCBzZWxlY3RvcjogJHtydWxlLnNlbGVjdG9yfWApO1xuICAgICAgICAgIGxvZ2dlci52ZXJib3NlKGBTa2lwcGluZyBjb21wbGV4IHNlbGVjdG9yOiAke3J1bGUuc2VsZWN0b3J9YCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5wcm9jZXNzUnVsZShydWxlKTtcbiAgICAgICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7IGNzc1J1bGUsIGNvbnZlcnNpb25SZXN1bHRzLCBjb252ZXJzaW9uV2FybmluZ3MgfSA9IHJlc3VsdDtcbiAgICAgICAgcnVsZXMucHVzaChjc3NSdWxlKTtcbiAgICAgICAgd2FybmluZ3MucHVzaCguLi5jb252ZXJzaW9uV2FybmluZ3MpO1xuXG4gICAgICAgIGlmIChjc3NSdWxlLmNvbnZlcnRlZENsYXNzZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGhhc0NoYW5nZXMgPSB0cnVlO1xuXG4gICAgICAgICAgaWYgKGNzc1J1bGUuZnVsbHlDb252ZXJ0ZWQpIHtcbiAgICAgICAgICAgIHJ1bGUucmVtb3ZlKCk7XG4gICAgICAgICAgICBsb2dnZXIudmVyYm9zZShgUmVtb3ZlZCBydWxlIC4ke2Nzc1J1bGUuY2xhc3NOYW1lfSAoYWxsICR7Y3NzUnVsZS5kZWNsYXJhdGlvbnMubGVuZ3RofSBkZWNsYXJhdGlvbnMgY29udmVydGVkKWApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgcmVtb3ZlZENvdW50ID0gMDtcbiAgICAgICAgICAgIHJ1bGUud2Fsa0RlY2xzKChkZWNsKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHdhc0NvbnZlcnRlZCA9IGNvbnZlcnNpb25SZXN1bHRzLnNvbWUociA9PlxuICAgICAgICAgICAgICAgIHIuY29udmVydGVkICYmXG4gICAgICAgICAgICAgICAgci5kZWNsYXJhdGlvbi5wcm9wZXJ0eSA9PT0gZGVjbC5wcm9wICYmXG4gICAgICAgICAgICAgICAgci5kZWNsYXJhdGlvbi52YWx1ZSA9PT0gZGVjbC52YWx1ZVxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgIGlmICh3YXNDb252ZXJ0ZWQpIHtcbiAgICAgICAgICAgICAgICBkZWNsLnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgIHJlbW92ZWRDb3VudCsrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgbG9nZ2VyLnZlcmJvc2UoYFBhcnRpYWwgY29udmVyc2lvbiBvZiAuJHtjc3NSdWxlLmNsYXNzTmFtZX06IHJlbW92ZWQgJHtyZW1vdmVkQ291bnR9LyR7Y3NzUnVsZS5kZWNsYXJhdGlvbnMubGVuZ3RofSBkZWNsYXJhdGlvbnNgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICByb290LndhbGtBdFJ1bGVzKChhdFJ1bGUpID0+IHtcbiAgICAgICAgaWYgKGF0UnVsZS5ub2RlcyAmJiBhdFJ1bGUubm9kZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgYXRSdWxlLnJlbW92ZSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgY2FuRGVsZXRlID0gcm9vdC5ub2Rlcy5sZW5ndGggPT09IDA7XG4gICAgICBjb25zdCBuZXdDc3MgPSByb290LnRvU3RyaW5nKCk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNzczogbmV3Q3NzLFxuICAgICAgICBydWxlcyxcbiAgICAgICAgaGFzQ2hhbmdlcyxcbiAgICAgICAgY2FuRGVsZXRlLFxuICAgICAgICB3YXJuaW5nc1xuICAgICAgfTtcblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBwYXJzZSBDU1MgJHtmaWxlUGF0aH06YCwgZXJyb3IpO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDU1MgcGFyc2luZyBmYWlsZWQ6ICR7ZXJyb3J9YCk7XG4gICAgfVxuICB9XG5cbiAgcGFyc2VJbnRlcm5hbFN0eWxlKGh0bWw6IHN0cmluZyk6IHsgXG4gICAgc3R5bGVzOiBBcnJheTx7IGNvbnRlbnQ6IHN0cmluZzsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXIgfT47XG4gICAgd2FybmluZ3M6IHN0cmluZ1tdO1xuICB9IHtcbiAgICBjb25zdCBzdHlsZXM6IEFycmF5PHsgY29udGVudDogc3RyaW5nOyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9PiA9IFtdO1xuICAgIGNvbnN0IHdhcm5pbmdzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgLy8gU2ltcGxlIHJlZ2V4IHRvIGZpbmQgc3R5bGUgdGFncyAodGhpcyBpcyBzYWZlIGZvciBmaW5kaW5nIHRhZ3MsIG5vdCBmb3IgcGFyc2luZyBjb250ZW50KVxuICAgIGNvbnN0IHN0eWxlUmVnZXggPSAvPHN0eWxlW14+XSo+KFtcXHNcXFNdKj8pPFxcL3N0eWxlPi9naTtcbiAgICBsZXQgbWF0Y2g7XG5cbiAgICB3aGlsZSAoKG1hdGNoID0gc3R5bGVSZWdleC5leGVjKGh0bWwpKSAhPT0gbnVsbCkge1xuICAgICAgc3R5bGVzLnB1c2goe1xuICAgICAgICBjb250ZW50OiBtYXRjaFsxXS50cmltKCksXG4gICAgICAgIHN0YXJ0OiBtYXRjaC5pbmRleCxcbiAgICAgICAgZW5kOiBtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgc3R5bGVzLCB3YXJuaW5ncyB9O1xuICB9XG5cbiAgYXN5bmMgcGFyc2VJbnRlcm5hbENTUyhodG1sOiBzdHJpbmcsIGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHtcbiAgICBodG1sOiBzdHJpbmc7XG4gICAgcnVsZXM6IENTU1J1bGVbXTtcbiAgICBoYXNDaGFuZ2VzOiBib29sZWFuO1xuICAgIHdhcm5pbmdzOiBzdHJpbmdbXTtcbiAgfT4ge1xuICAgIGNvbnN0IGFsbFJ1bGVzOiBDU1NSdWxlW10gPSBbXTtcbiAgICBjb25zdCBhbGxXYXJuaW5nczogc3RyaW5nW10gPSBbXTtcbiAgICBsZXQgbW9kaWZpZWRIdG1sID0gaHRtbDtcbiAgICBsZXQgaGFzQ2hhbmdlcyA9IGZhbHNlO1xuXG4gICAgY29uc3QgeyBzdHlsZXMgfSA9IHRoaXMucGFyc2VJbnRlcm5hbFN0eWxlKGh0bWwpO1xuXG4gICAgLy8gUHJvY2VzcyBzdHlsZXMgaW4gcmV2ZXJzZSBvcmRlciB0byBwcmVzZXJ2ZSBpbmRpY2VzXG4gICAgZm9yIChsZXQgaSA9IHN0eWxlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgY29uc3Qgc3R5bGUgPSBzdHlsZXNbaV07XG4gICAgICBcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucGFyc2Uoc3R5bGUuY29udGVudCwgZmlsZVBhdGgpO1xuICAgICAgICBcbiAgICAgICAgYWxsUnVsZXMucHVzaCguLi5yZXN1bHQucnVsZXMpO1xuICAgICAgICBhbGxXYXJuaW5ncy5wdXNoKC4uLnJlc3VsdC53YXJuaW5ncyk7XG5cbiAgICAgICAgaWYgKHJlc3VsdC5oYXNDaGFuZ2VzKSB7XG4gICAgICAgICAgaGFzQ2hhbmdlcyA9IHRydWU7XG5cbiAgICAgICAgICBpZiAocmVzdWx0LmNhbkRlbGV0ZSB8fCByZXN1bHQuY3NzLnRyaW0oKSA9PT0gJycpIHtcbiAgICAgICAgICAgIC8vIFJlbW92ZSBlbnRpcmUgc3R5bGUgdGFnXG4gICAgICAgICAgICBtb2RpZmllZEh0bWwgPSBtb2RpZmllZEh0bWwuc2xpY2UoMCwgc3R5bGUuc3RhcnQpICsgbW9kaWZpZWRIdG1sLnNsaWNlKHN0eWxlLmVuZCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFJlcGxhY2Ugc3R5bGUgY29udGVudFxuICAgICAgICAgICAgY29uc3QgYmVmb3JlID0gbW9kaWZpZWRIdG1sLnNsaWNlKDAsIHN0eWxlLnN0YXJ0KTtcbiAgICAgICAgICAgIGNvbnN0IGFmdGVyID0gbW9kaWZpZWRIdG1sLnNsaWNlKHN0eWxlLmVuZCk7XG4gICAgICAgICAgICBjb25zdCB0YWdTdGFydCA9IGh0bWwuc2xpY2Uoc3R5bGUuc3RhcnQpLm1hdGNoKC88c3R5bGVbXj5dKj4vKT8uWzBdIHx8ICc8c3R5bGU+JztcbiAgICAgICAgICAgIGNvbnN0IHRhZ0VuZCA9ICc8L3N0eWxlPic7XG4gICAgICAgICAgICBtb2RpZmllZEh0bWwgPSBiZWZvcmUgKyB0YWdTdGFydCArICdcXG4nICsgcmVzdWx0LmNzcyArICdcXG4nICsgdGFnRW5kICsgYWZ0ZXI7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBsb2dnZXIud2FybihgRmFpbGVkIHRvIHBhcnNlIGludGVybmFsIHN0eWxlIGJsb2NrOiAke2Vycm9yfWApO1xuICAgICAgICBhbGxXYXJuaW5ncy5wdXNoKGBGYWlsZWQgdG8gcGFyc2UgaW50ZXJuYWwgc3R5bGU6ICR7ZXJyb3J9YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGh0bWw6IG1vZGlmaWVkSHRtbCxcbiAgICAgIHJ1bGVzOiBhbGxSdWxlcyxcbiAgICAgIGhhc0NoYW5nZXMsXG4gICAgICB3YXJuaW5nczogYWxsV2FybmluZ3NcbiAgICB9O1xuICB9XG5cbiAgZXh0cmFjdEltcG9ydFBhdGhzKGNvZGU6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBpbXBvcnRzOiBzdHJpbmdbXSA9IFtdO1xuICAgIFxuICAgIC8vIE1hdGNoIENTUyBpbXBvcnRzXG4gICAgY29uc3QgaW1wb3J0UmVnZXggPSAvaW1wb3J0XFxzK1snXCJdKFteJ1wiXStcXC5jc3MpWydcIl07Py9nO1xuICAgIGxldCBtYXRjaDtcbiAgICBcbiAgICB3aGlsZSAoKG1hdGNoID0gaW1wb3J0UmVnZXguZXhlYyhjb2RlKSkgIT09IG51bGwpIHtcbiAgICAgIGltcG9ydHMucHVzaChtYXRjaFsxXSk7XG4gICAgfVxuXG4gICAgLy8gTWF0Y2ggcmVxdWlyZSBzdGF0ZW1lbnRzXG4gICAgY29uc3QgcmVxdWlyZVJlZ2V4ID0gL3JlcXVpcmVcXHMqXFwoXFxzKlsnXCJdKFteJ1wiXStcXC5jc3MpWydcIl1cXHMqXFwpL2c7XG4gICAgd2hpbGUgKChtYXRjaCA9IHJlcXVpcmVSZWdleC5leGVjKGNvZGUpKSAhPT0gbnVsbCkge1xuICAgICAgaW1wb3J0cy5wdXNoKG1hdGNoWzFdKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaW1wb3J0cztcbiAgfVxufVxuIl19
|
|
392
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3NzUGFyc2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2Nzc1BhcnNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxzREFBbUU7QUFDbkUsOEVBQTZDO0FBRTdDLDJDQUF3QztBQUN4QyxtRUFLb0M7QUFDcEMsMkVBSXdDO0FBQ3hDLG1GQU00QztBQUM1QywrREFNa0M7QUF1Q2xDLE1BQWEsU0FBUztJQUlwQixZQUFZLE1BQXNCLEVBQUUsT0FBbUQ7UUFDckYsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLFdBQVcsR0FBRyxPQUFPO1lBQ3hCLENBQUMsQ0FBQyxJQUFBLGlEQUE0QixFQUFDLE9BQU8sQ0FBQztZQUN2QyxDQUFDLENBQUMsSUFBQSxtQ0FBYyxHQUFFLENBQUM7SUFDdkIsQ0FBQztJQUVPLG1CQUFtQixDQUFDLFlBQTJCO1FBS3JELE1BQU0saUJBQWlCLEdBSWxCLEVBQUUsQ0FBQztRQUNSLE1BQU0sa0JBQWtCLEdBQWEsRUFBRSxDQUFDO1FBRXhDLFlBQVksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDMUIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDdEUsaUJBQWlCLENBQUMsSUFBSSxDQUFDO2dCQUNyQixXQUFXLEVBQUUsSUFBSTtnQkFDakIsU0FBUyxFQUFFLENBQUMsTUFBTSxDQUFDLE9BQU8sSUFBSSxNQUFNLENBQUMsU0FBUyxLQUFLLElBQUk7Z0JBQ3ZELFNBQVMsRUFBRSxNQUFNLENBQUMsU0FBUzthQUM1QixDQUFDLENBQUM7WUFDSCxJQUFJLE1BQU0sQ0FBQyxPQUFPLElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNwQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FB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QyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUNsRCxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3pCLENBQUM7UUFFRCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0NBQ0Y7QUF6ZEQsOEJBeWRDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHBvc3Rjc3MsIHsgUm9vdCwgUnVsZSwgRGVjbGFyYXRpb24sIEF0UnVsZSB9IGZyb20gJ3Bvc3Rjc3MnO1xuaW1wb3J0IHNhZmVQYXJzZXIgZnJvbSAncG9zdGNzcy1zYWZlLXBhcnNlcic7XG5pbXBvcnQgeyBUYWlsd2luZE1hcHBlciwgQ1NTUHJvcGVydHkgfSBmcm9tICcuL3RhaWx3aW5kTWFwcGVyJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4vdXRpbHMvbG9nZ2VyJztcbmltcG9ydCB7IFxuICBCcmVha3BvaW50LCBcbiAgZ2V0QnJlYWtwb2ludHMsIFxuICByZXNvbHZlQnJlYWtwb2ludHNGcm9tQ29uZmlnLFxuICBwcm9jZXNzTWVkaWFRdWVyeSBcbn0gZnJvbSAnLi91dGlscy9icmVha3BvaW50UmVzb2x2ZXInO1xuaW1wb3J0IHtcbiAgcHJvY2Vzc1BzZXVkb1NlbGVjdG9yLFxuICBwYXJzZU11bHRpcGxlU2VsZWN0b3JzLFxuICBQYXJzZWRTZWxlY3RvclxufSBmcm9tICcuL3V0aWxzL3BzZXVkb1NlbGVjdG9yUmVzb2x2ZXInO1xuaW1wb3J0IHtcbiAgcGFyc2VEZXNjZW5kYW50U2VsZWN0b3IsXG4gIHByb2Nlc3NEZXNjZW5kYW50U2VsZWN0b3IsXG4gIERlc2NlbmRhbnRTZWxlY3RvcixcbiAgU2VsZWN0b3JQYXJ0LFxuICBpc0h0bWxFbGVtZW50XG59IGZyb20gJy4vdXRpbHMvZGVzY2VuZGFudFNlbGVjdG9yUmVzb2x2ZXInO1xuaW1wb3J0IHtcbiAgYXNzZW1ibGVVdGlsaXR5LFxuICBhc3NlbWJsZVV0aWxpdGllcyxcbiAgTWVyZ2VkVXRpbGl0eSxcbiAgbWVyZ2VVdGlsaXRpZXMsXG4gIG5vcm1hbGl6ZVZhcmlhbnRPcmRlclxufSBmcm9tICcuL3V0aWxzL3ZhcmlhbnRBc3NlbWJsZXInO1xuXG5leHBvcnQgaW50ZXJmYWNlIFV0aWxpdHlXaXRoVmFyaWFudCB7XG4gIHZhbHVlOiBzdHJpbmc7XG4gIHZhcmlhbnRzOiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTZWxlY3RvclRhcmdldCB7XG4gIHR5cGU6ICdjbGFzcycgfCAnZWxlbWVudCc7XG4gIG5hbWU6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDU1NSdWxlIHtcbiAgc2VsZWN0b3I6IHN0cmluZztcbiAgY2xhc3NOYW1lOiBzdHJpbmc7XG4gIGRlY2xhcmF0aW9uczogQ1NTUHJvcGVydHlbXTtcbiAgY29udmVydGVkQ2xhc3Nlczogc3RyaW5nW107XG4gIHV0aWxpdGllczogVXRpbGl0eVdpdGhWYXJpYW50W107XG4gIHNraXBwZWQ6IGJvb2xlYW47XG4gIGZ1bGx5Q29udmVydGVkOiBib29sZWFuO1xuICBwYXJ0aWFsQ29udmVyc2lvbjogYm9vbGVhbjtcbiAgcmVhc29uPzogc3RyaW5nO1xuICBpc0Rlc2NlbmRhbnQ6IGJvb2xlYW47XG4gIHBhcmVudFNlbGVjdG9yPzogU2VsZWN0b3JUYXJnZXQ7XG4gIHRhcmdldFNlbGVjdG9yPzogU2VsZWN0b3JUYXJnZXQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ1NTUGFyc2VSZXN1bHQge1xuICBjc3M6IHN0cmluZztcbiAgcnVsZXM6IENTU1J1bGVbXTtcbiAgaGFzQ2hhbmdlczogYm9vbGVhbjtcbiAgY2FuRGVsZXRlOiBib29sZWFuO1xuICB3YXJuaW5nczogc3RyaW5nW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ1NTVXNhZ2VNYXAge1xuICBbY2xhc3NOYW1lOiBzdHJpbmddOiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGNsYXNzIENTU1BhcnNlciB7XG4gIHByaXZhdGUgbWFwcGVyOiBUYWlsd2luZE1hcHBlcjtcbiAgcHJpdmF0ZSBicmVha3BvaW50czogQnJlYWtwb2ludFtdO1xuXG4gIGNvbnN0cnVjdG9yKG1hcHBlcjogVGFpbHdpbmRNYXBwZXIsIHNjcmVlbnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBbc3RyaW5nLCBzdHJpbmddPikge1xuICAgIHRoaXMubWFwcGVyID0gbWFwcGVyO1xuICAgIHRoaXMuYnJlYWtwb2ludHMgPSBzY3JlZW5zIFxuICAgICAgPyByZXNvbHZlQnJlYWtwb2ludHNGcm9tQ29uZmlnKHNjcmVlbnMpIFxuICAgICAgOiBnZXRCcmVha3BvaW50cygpO1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0RGVjbGFyYXRpb25zKGRlY2xhcmF0aW9uczogQ1NTUHJvcGVydHlbXSk6IHtcbiAgICB1dGlsaXRpZXM6IFV0aWxpdHlXaXRoVmFyaWFudFtdO1xuICAgIGNvbnZlcnNpb25SZXN1bHRzOiBBcnJheTx7IGRlY2xhcmF0aW9uOiBDU1NQcm9wZXJ0eTsgY29udmVydGVkOiBib29sZWFuOyBjbGFzc05hbWU6IHN0cmluZyB8IG51bGwgfT47XG4gICAgY29udmVyc2lvbldhcm5pbmdzOiBzdHJpbmdbXTtcbiAgfSB7XG4gICAgY29uc3QgY29udmVyc2lvblJlc3VsdHM6IEFycmF5PHtcbiAgICAgIGRlY2xhcmF0aW9uOiBDU1NQcm9wZXJ0eTtcbiAgICAgIGNvbnZlcnRlZDogYm9vbGVhbjtcbiAgICAgIGNsYXNzTmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICB9PiA9IFtdO1xuICAgIGNvbnN0IGNvbnZlcnNpb25XYXJuaW5nczogc3RyaW5nW10gPSBbXTtcblxuICAgIGRlY2xhcmF0aW9ucy5mb3JFYWNoKGRlY2wgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5tYXBwZXIuY29udmVydFByb3BlcnR5KGRlY2wucHJvcGVydHksIGRlY2wudmFsdWUpO1xuICAgICAgY29udmVyc2lvblJlc3VsdHMucHVzaCh7XG4gICAgICAgIGRlY2xhcmF0aW9uOiBkZWNsLFxuICAgICAgICBjb252ZXJ0ZWQ6ICFyZXN1bHQuc2tpcHBlZCAmJiByZXN1bHQuY2xhc3NOYW1lICE9PSBudWxsLFxuICAgICAgICBjbGFzc05hbWU6IHJlc3VsdC5jbGFzc05hbWVcbiAgICAgIH0pO1xuICAgICAgaWYgKHJlc3VsdC5za2lwcGVkICYmIHJlc3VsdC5yZWFzb24pIHtcbiAgICAgICAgY29udmVyc2lvbldhcm5pbmdzLnB1c2gocmVzdWx0LnJlYXNvbik7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zdCB1dGlsaXRpZXM6IFV0aWxpdHlXaXRoVmFyaWFudFtdID0gY29udmVyc2lvblJlc3VsdHNcbiAgICAgIC5maWx0ZXIociA9PiByLmNvbnZlcnRlZCAmJiByLmNsYXNzTmFtZSlcbiAgICAgIC5tYXAociA9PiAoe1xuICAgICAgICB2YWx1ZTogci5jbGFzc05hbWUhLFxuICAgICAgICB2YXJpYW50czogW11cbiAgICAgIH0pKTtcblxuICAgIHJldHVybiB7IHV0aWxpdGllcywgY29udmVyc2lvblJlc3VsdHMsIGNvbnZlcnNpb25XYXJuaW5ncyB9O1xuICB9XG5cbiAgcHJpdmF0ZSBwcm9jZXNzU2ltcGxlUnVsZShcbiAgICBydWxlOiBSdWxlLFxuICAgIGFkZGl0aW9uYWxWYXJpYW50czogc3RyaW5nW10gPSBbXVxuICApOiB7IGNzc1J1bGVzOiBDU1NSdWxlW107IGNvbnZlcnNpb25SZXN1bHRzOiBBcnJheTx7IGRlY2xhcmF0aW9uOiBDU1NQcm9wZXJ0eTsgY29udmVydGVkOiBib29sZWFuOyBjbGFzc05hbWU6IHN0cmluZyB8IG51bGwgfT5bXTsgY29udmVyc2lvbldhcm5pbmdzOiBzdHJpbmdbXSB9IHwgbnVsbCB7XG4gICAgY29uc3Qgc2VsZWN0b3IgPSBydWxlLnNlbGVjdG9yO1xuICAgIGNvbnN0IHBhcnNlZFNlbGVjdG9ycyA9IHBhcnNlTXVsdGlwbGVTZWxlY3RvcnMoc2VsZWN0b3IpO1xuICAgIFxuICAgIGNvbnN0IHZhbGlkU2VsZWN0b3JzID0gcGFyc2VkU2VsZWN0b3JzLmZpbHRlcihzID0+ICFzLmlzQ29tcGxleCAmJiBzLmJhc2VDbGFzcyk7XG4gICAgXG4gICAgaWYgKHZhbGlkU2VsZWN0b3JzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgZGVjbGFyYXRpb25zOiBDU1NQcm9wZXJ0eVtdID0gW107XG5cbiAgICBydWxlLndhbGtEZWNscygoZGVjbCkgPT4ge1xuICAgICAgaWYgKGRlY2wucHJvcC5zdGFydHNXaXRoKCctLScpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGRlY2wudmFsdWUuaW5jbHVkZXMoJ2NhbGMoJykpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBkZWNsYXJhdGlvbnMucHVzaCh7XG4gICAgICAgIHByb3BlcnR5OiBkZWNsLnByb3AsXG4gICAgICAgIHZhbHVlOiBkZWNsLnZhbHVlXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGlmIChkZWNsYXJhdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCB7IHV0aWxpdGllcywgY29udmVyc2lvblJlc3VsdHMsIGNvbnZlcnNpb25XYXJuaW5ncyB9ID0gdGhpcy5jb252ZXJ0RGVjbGFyYXRpb25zKGRlY2xhcmF0aW9ucyk7XG4gICAgXG4gICAgY29uc3QgdXRpbGl0aWVzV2l0aFZhcmlhbnRzID0gdXRpbGl0aWVzLm1hcCh1ID0+ICh7XG4gICAgICB2YWx1ZTogdS52YWx1ZSxcbiAgICAgIHZhcmlhbnRzOiBub3JtYWxpemVWYXJpYW50T3JkZXIoWy4uLnUudmFyaWFudHMsIC4uLmFkZGl0aW9uYWxWYXJpYW50c10pXG4gICAgfSkpO1xuXG4gICAgY29uc3QgY3NzUnVsZXM6IENTU1J1bGVbXSA9IFtdO1xuICAgIGNvbnN0IGFsbENvbnZlcnNpb25SZXN1bHRzOiBBcnJheTx7IGRlY2xhcmF0aW9uOiBDU1NQcm9wZXJ0eTsgY29udmVydGVkOiBib29sZWFuOyBjbGFzc05hbWU6IHN0cmluZyB8IG51bGwgfT5bXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBwYXJzZWQgb2YgdmFsaWRTZWxlY3RvcnMpIHtcbiAgICAgIGNvbnN0IHBzZXVkb1ZhcmlhbnRzID0gcGFyc2VkLnBzZXVkb3MgfHwgW107XG4gICAgICBjb25zdCBhbGxWYXJpYW50cyA9IG5vcm1hbGl6ZVZhcmlhbnRPcmRlcihbLi4ucHNldWRvVmFyaWFudHMsIC4uLmFkZGl0aW9uYWxWYXJpYW50c10pO1xuICAgICAgXG4gICAgICBjb25zdCB1dGlsaXRpZXNGb3JTZWxlY3RvciA9IHV0aWxpdGllcy5tYXAodSA9PiAoe1xuICAgICAgICB2YWx1ZTogdS52YWx1ZSxcbiAgICAgICAgdmFyaWFudHM6IGFsbFZhcmlhbnRzXG4gICAgICB9KSk7XG5cbiAgICAgIGNvbnN0IGNvbnZlcnRlZENsYXNzZXMgPSBhc3NlbWJsZVV0aWxpdGllcyh1dGlsaXRpZXNGb3JTZWxlY3Rvcik7XG5cbiAgICAgIGNvbnN0IGFsbERlY2xhcmF0aW9uc0NvbnZlcnRlZCA9IGNvbnZlcnNpb25SZXN1bHRzLmV2ZXJ5KHIgPT4gci5jb252ZXJ0ZWQpO1xuICAgICAgY29uc3Qgc29tZURlY2xhcmF0aW9uc0NvbnZlcnRlZCA9IGNvbnZlcnRlZENsYXNzZXMubGVuZ3RoID4gMDtcblxuICAgICAgY29uc3QgY3NzUnVsZTogQ1NTUnVsZSA9IHtcbiAgICAgICAgc2VsZWN0b3I6IHNlbGVjdG9yLFxuICAgICAgICBjbGFzc05hbWU6IHBhcnNlZC5iYXNlQ2xhc3MsXG4gICAgICAgIGRlY2xhcmF0aW9ucyxcbiAgICAgICAgY29udmVydGVkQ2xhc3NlcyxcbiAgICAgICAgdXRpbGl0aWVzOiB1dGlsaXRpZXNGb3JTZWxlY3RvcixcbiAgICAgICAgc2tpcHBlZDogIXNvbWVEZWNsYXJhdGlvbnNDb252ZXJ0ZWQsXG4gICAgICAgIGZ1bGx5Q29udmVydGVkOiBhbGxEZWNsYXJhdGlvbnNDb252ZXJ0ZWQsXG4gICAgICAgIHBhcnRpYWxDb252ZXJzaW9uOiBzb21lRGVjbGFyYXRpb25zQ29udmVydGVkICYmICFhbGxEZWNsYXJhdGlvbnNDb252ZXJ0ZWQsXG4gICAgICAgIHJlYXNvbjogIXNvbWVEZWNsYXJhdGlvbnNDb252ZXJ0ZWQgPyAnTm8gY29udmVydGlibGUgZGVjbGFyYXRpb25zJyA6IHVuZGVmaW5lZCxcbiAgICAgICAgaXNEZXNjZW5kYW50OiBmYWxzZVxuICAgICAgfTtcblxuICAgICAgY3NzUnVsZXMucHVzaChjc3NSdWxlKTtcbiAgICAgIGFsbENvbnZlcnNpb25SZXN1bHRzLnB1c2goY29udmVyc2lvblJlc3VsdHMpO1xuICAgIH1cblxuICAgIHJldHVybiB7IGNzc1J1bGVzLCBjb252ZXJzaW9uUmVzdWx0czogYWxsQ29udmVyc2lvblJlc3VsdHMsIGNvbnZlcnNpb25XYXJuaW5ncyB9O1xuICB9XG5cbiAgcHJpdmF0ZSBwcm9jZXNzRGVzY2VuZGFudFJ1bGUoXG4gICAgcnVsZTogUnVsZSxcbiAgICBhZGRpdGlvbmFsVmFyaWFudHM6IHN0cmluZ1tdID0gW11cbiAgKTogeyBjc3NSdWxlOiBDU1NSdWxlOyBjb252ZXJzaW9uUmVzdWx0czogQXJyYXk8eyBkZWNsYXJhdGlvbjogQ1NTUHJvcGVydHk7IGNvbnZlcnRlZDogYm9vbGVhbjsgY2xhc3NOYW1lOiBzdHJpbmcgfCBudWxsIH0+OyBjb252ZXJzaW9uV2FybmluZ3M6IHN0cmluZ1tdIH0gfCBudWxsIHtcbiAgICBjb25zdCBzZWxlY3RvciA9IHJ1bGUuc2VsZWN0b3I7XG4gICAgY29uc3QgcGFyc2VkID0gcGFyc2VEZXNjZW5kYW50U2VsZWN0b3Ioc2VsZWN0b3IpO1xuICAgIFxuICAgIGlmIChwYXJzZWQuaXNDb21wbGV4IHx8ICFwYXJzZWQucGFyZW50KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBkZWNsYXJhdGlvbnM6IENTU1Byb3BlcnR5W10gPSBbXTtcblxuICAgIHJ1bGUud2Fsa0RlY2xzKChkZWNsKSA9PiB7XG4gICAgICBpZiAoZGVjbC5wcm9wLnN0YXJ0c1dpdGgoJy0tJykpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGVjbC52YWx1ZS5pbmNsdWRlcygnY2FsYygnKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGRlY2xhcmF0aW9ucy5wdXNoKHtcbiAgICAgICAgcHJvcGVydHk6IGRlY2wucHJvcCxcbiAgICAgICAgdmFsdWU6IGRlY2wudmFsdWVcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaWYgKGRlY2xhcmF0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHsgdXRpbGl0aWVzLCBjb252ZXJzaW9uUmVzdWx0cywgY29udmVyc2lvbldhcm5pbmdzIH0gPSB0aGlzLmNvbnZlcnREZWNsYXJhdGlvbnMoZGVjbGFyYXRpb25zKTtcbiAgICBcbiAgICBjb25zdCB1dGlsaXRpZXNXaXRoVmFyaWFudHMgPSB1dGlsaXRpZXMubWFwKHUgPT4gKHtcbiAgICAgIHZhbHVlOiB1LnZhbHVlLFxuICAgICAgdmFyaWFudHM6IG5vcm1hbGl6ZVZhcmlhbnRPcmRlcihbLi4udS52YXJpYW50cywgLi4uYWRkaXRpb25hbFZhcmlhbnRzXSlcbiAgICB9KSk7XG5cbiAgICBjb25zdCBjb252ZXJ0ZWRDbGFzc2VzID0gYXNzZW1ibGVVdGlsaXRpZXModXRpbGl0aWVzV2l0aFZhcmlhbnRzKTtcblxuICAgIGNvbnN0IGFsbERlY2xhcmF0aW9uc0NvbnZlcnRlZCA9IGNvbnZlcnNpb25SZXN1bHRzLmV2ZXJ5KHIgPT4gci5jb252ZXJ0ZWQpO1xuICAgIGNvbnN0IHNvbWVEZWNsYXJhdGlvbnNDb252ZXJ0ZWQgPSBjb252ZXJ0ZWRDbGFzc2VzLmxlbmd0aCA+IDA7XG5cbiAgICBjb25zdCBjbGFzc05hbWUgPSBwYXJzZWQucGFyZW50LnR5cGUgPT09ICdjbGFzcycgPyBwYXJzZWQucGFyZW50Lm5hbWUgOiAnJztcbiAgICBjb25zdCB0YXJnZXROYW1lID0gcGFyc2VkLnRhcmdldC50eXBlID09PSAnY2xhc3MnID8gYC4ke3BhcnNlZC50YXJnZXQubmFtZX1gIDogcGFyc2VkLnRhcmdldC5uYW1lO1xuXG4gICAgY29uc3QgY3NzUnVsZTogQ1NTUnVsZSA9IHtcbiAgICAgIHNlbGVjdG9yOiBzZWxlY3RvcixcbiAgICAgIGNsYXNzTmFtZSxcbiAgICAgIGRlY2xhcmF0aW9ucyxcbiAgICAgIGNvbnZlcnRlZENsYXNzZXMsXG4gICAgICB1dGlsaXRpZXM6IHV0aWxpdGllc1dpdGhWYXJpYW50cyxcbiAgICAgIHNraXBwZWQ6ICFzb21lRGVjbGFyYXRpb25zQ29udmVydGVkLFxuICAgICAgZnVsbHlDb252ZXJ0ZWQ6IGFsbERlY2xhcmF0aW9uc0NvbnZlcnRlZCxcbiAgICAgIHBhcnRpYWxDb252ZXJzaW9uOiBzb21lRGVjbGFyYXRpb25zQ29udmVydGVkICYmICFhbGxEZWNsYXJhdGlvbnNDb252ZXJ0ZWQsXG4gICAgICByZWFzb246ICFzb21lRGVjbGFyYXRpb25zQ29udmVydGVkID8gJ05vIGNvbnZlcnRpYmxlIGRlY2xhcmF0aW9ucycgOiB1bmRlZmluZWQsXG4gICAgICBpc0Rlc2NlbmRhbnQ6IHRydWUsXG4gICAgICBwYXJlbnRTZWxlY3RvcjogcGFyc2VkLnBhcmVudCxcbiAgICAgIHRhcmdldFNlbGVjdG9yOiBwYXJzZWQudGFyZ2V0XG4gICAgfTtcblxuICAgIHJldHVybiB7IGNzc1J1bGUsIGNvbnZlcnNpb25SZXN1bHRzLCBjb252ZXJzaW9uV2FybmluZ3MgfTtcbiAgfVxuXG4gIGFzeW5jIHBhcnNlKGNzczogc3RyaW5nLCBmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxDU1NQYXJzZVJlc3VsdD4ge1xuICAgIGNvbnN0IHJ1bGVzOiBDU1NSdWxlW10gPSBbXTtcbiAgICBjb25zdCB3YXJuaW5nczogc3RyaW5nW10gPSBbXTtcbiAgICBsZXQgaGFzQ2hhbmdlcyA9IGZhbHNlO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJvb3QgPSBhd2FpdCBwb3N0Y3NzKCkucHJvY2Vzcyhjc3MsIHtcbiAgICAgICAgcGFyc2VyOiBzYWZlUGFyc2VyLFxuICAgICAgICBmcm9tOiBmaWxlUGF0aFxuICAgICAgfSkudGhlbihyZXN1bHQgPT4gcmVzdWx0LnJvb3QpO1xuXG4gICAgICByb290LndhbGtBdFJ1bGVzKChhdFJ1bGUpID0+IHtcbiAgICAgICAgaWYgKGF0UnVsZS5uYW1lICE9PSAnbWVkaWEnKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbWVkaWFSZXN1bHQgPSBwcm9jZXNzTWVkaWFRdWVyeShhdFJ1bGUucGFyYW1zLCB0aGlzLmJyZWFrcG9pbnRzKTtcblxuICAgICAgICBpZiAobWVkaWFSZXN1bHQuc2tpcHBlZCkge1xuICAgICAgICAgIHdhcm5pbmdzLnB1c2gobWVkaWFSZXN1bHQucmVhc29uIHx8IGBTa2lwcGVkIG1lZGlhIHF1ZXJ5OiAke2F0UnVsZS5wYXJhbXN9YCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2l2ZVZhcmlhbnQgPSBtZWRpYVJlc3VsdC5icmVha3BvaW50ITtcblxuICAgICAgICBjb25zdCBuZXN0ZWRSdWxlczogUnVsZVtdID0gW107XG4gICAgICAgIGF0UnVsZS53YWxrUnVsZXMoKHJ1bGUpID0+IHtcbiAgICAgICAgICBuZXN0ZWRSdWxlcy5wdXNoKHJ1bGUpO1xuICAgICAgICB9KTtcblxuICAgICAgICBmb3IgKGNvbnN0IHJ1bGUgb2YgbmVzdGVkUnVsZXMpIHtcbiAgICAgICAgICBjb25zdCBkZXNjZW5kYW50UmVzdWx0ID0gdGhpcy5wcm9jZXNzRGVzY2VuZGFudFJ1bGUocnVsZSwgW3Jlc3BvbnNpdmVWYXJpYW50XSk7XG4gICAgICAgICAgaWYgKGRlc2NlbmRhbnRSZXN1bHQpIHtcbiAgICAgICAgICAgIHJ1bGVzLnB1c2goZGVzY2VuZGFudFJlc3VsdC5jc3NSdWxlKTtcbiAgICAgICAgICAgIHdhcm5pbmdzLnB1c2goLi4uZGVzY2VuZGFudFJlc3VsdC5jb252ZXJzaW9uV2FybmluZ3MpO1xuXG4gICAgICAgICAgICBpZiAoZGVzY2VuZGFudFJlc3VsdC5jc3NSdWxlLmNvbnZlcnRlZENsYXNzZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICBoYXNDaGFuZ2VzID0gdHJ1ZTtcblxuICAgICAgICAgICAgICBpZiAoZGVzY2VuZGFudFJlc3VsdC5jc3NSdWxlLmZ1bGx5Q29udmVydGVkKSB7XG4gICAgICAgICAgICAgICAgcnVsZS5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICBsb2dnZXIudmVyYm9zZShgUmVtb3ZlZCBkZXNjZW5kYW50IHJ1bGUgJHtydWxlLnNlbGVjdG9yfSBpbiBAbWVkaWEg4oaSICR7cmVzcG9uc2l2ZVZhcmlhbnR9YCk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBjciBvZiBkZXNjZW5kYW50UmVzdWx0LmNvbnZlcnNpb25SZXN1bHRzKSB7XG4gICAgICAgICAgICAgICAgICBpZiAoY3IuY29udmVydGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJ1bGUud2Fsa0RlY2xzKChkZWNsKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGRlY2wucHJvcCA9PT0gY3IuZGVjbGFyYXRpb24ucHJvcGVydHkgJiYgZGVjbC52YWx1ZSA9PT0gY3IuZGVjbGFyYXRpb24udmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlY2wucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbG9nZ2VyLnZlcmJvc2UoYFBhcnRpYWwgY29udmVyc2lvbiBvZiBkZXNjZW5kYW50IHJ1bGUgaW4gQG1lZGlhIOKGkiAke3Jlc3BvbnNpdmVWYXJpYW50fWApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBzaW1wbGVSZXN1bHQgPSB0aGlzLnByb2Nlc3NTaW1wbGVSdWxlKHJ1bGUsIFtyZXNwb25zaXZlVmFyaWFudF0pO1xuICAgICAgICAgIGlmIChzaW1wbGVSZXN1bHQpIHtcbiAgICAgICAgICAgIHJ1bGVzLnB1c2goLi4uc2ltcGxlUmVzdWx0LmNzc1J1bGVzKTtcbiAgICAgICAgICAgIHdhcm5pbmdzLnB1c2goLi4uc2ltcGxlUmVzdWx0LmNvbnZlcnNpb25XYXJuaW5ncyk7XG5cbiAgICAgICAgICAgIGNvbnN0IGFueUNvbnZlcnRlZCA9IHNpbXBsZVJlc3VsdC5jc3NSdWxlcy5zb21lKHIgPT4gci5jb252ZXJ0ZWRDbGFzc2VzLmxlbmd0aCA+IDApO1xuICAgICAgICAgICAgaWYgKGFueUNvbnZlcnRlZCkge1xuICAgICAgICAgICAgICBoYXNDaGFuZ2VzID0gdHJ1ZTtcblxuICAgICAgICAgICAgICBjb25zdCBhbGxGdWxseUNvbnZlcnRlZCA9IHNpbXBsZVJlc3VsdC5jc3NSdWxlcy5ldmVyeShyID0+IHIuZnVsbHlDb252ZXJ0ZWQpO1xuICAgICAgICAgICAgICBpZiAoYWxsRnVsbHlDb252ZXJ0ZWQpIHtcbiAgICAgICAgICAgICAgICBydWxlLnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNsYXNzTmFtZXMgPSBzaW1wbGVSZXN1bHQuY3NzUnVsZXMubWFwKHIgPT4gci5jbGFzc05hbWUpLmpvaW4oJywgLicpO1xuICAgICAgICAgICAgICAgIGxvZ2dlci52ZXJib3NlKGBSZW1vdmVkIHJ1bGUgLiR7Y2xhc3NOYW1lc30gaW4gQG1lZGlhIChtaW4td2lkdGgpIOKGkiAke3Jlc3BvbnNpdmVWYXJpYW50fWApO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgY3Igb2Ygc2ltcGxlUmVzdWx0LmNvbnZlcnNpb25SZXN1bHRzLmZsYXQoKSkge1xuICAgICAgICAgICAgICAgICAgaWYgKGNyLmNvbnZlcnRlZCkge1xuICAgICAgICAgICAgICAgICAgICBydWxlLndhbGtEZWNscygoZGVjbCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWNsLnByb3AgPT09IGNyLmRlY2xhcmF0aW9uLnByb3BlcnR5ICYmIGRlY2wudmFsdWUgPT09IGNyLmRlY2xhcmF0aW9uLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWNsLnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxvZ2dlci52ZXJib3NlKGBQYXJ0aWFsIGNvbnZlcnNpb24gaW4gQG1lZGlhIOKGkiAke3Jlc3BvbnNpdmVWYXJpYW50fWApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHdhcm5pbmdzLnB1c2goYFNraXBwZWQgcnVsZSBpbiBAbWVkaWE6ICR7cnVsZS5zZWxlY3Rvcn1gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYXRSdWxlLm5vZGVzICYmIGF0UnVsZS5ub2Rlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBhdFJ1bGUucmVtb3ZlKCk7XG4gICAgICAgICAgbG9nZ2VyLnZlcmJvc2UoYFJlbW92ZWQgZW1wdHkgQG1lZGlhIHJ1bGVgKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHJvb3Qud2Fsa1J1bGVzKChydWxlKSA9PiB7XG4gICAgICAgIGlmIChydWxlLnBhcmVudCAmJiBydWxlLnBhcmVudC50eXBlID09PSAnYXRydWxlJykge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRlc2NlbmRhbnRSZXN1bHQgPSB0aGlzLnByb2Nlc3NEZXNjZW5kYW50UnVsZShydWxlKTtcbiAgICAgICAgaWYgKGRlc2NlbmRhbnRSZXN1bHQpIHtcbiAgICAgICAgICBydWxlcy5wdXNoKGRlc2NlbmRhbnRSZXN1bHQuY3NzUnVsZSk7XG4gICAgICAgICAgd2FybmluZ3MucHVzaCguLi5kZXNjZW5kYW50UmVzdWx0LmNvbnZlcnNpb25XYXJuaW5ncyk7XG5cbiAgICAgICAgICBpZiAoZGVzY2VuZGFudFJlc3VsdC5jc3NSdWxlLmNvbnZlcnRlZENsYXNzZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgaGFzQ2hhbmdlcyA9IHRydWU7XG5cbiAgICAgICAgICAgIGlmIChkZXNjZW5kYW50UmVzdWx0LmNzc1J1bGUuZnVsbHlDb252ZXJ0ZWQpIHtcbiAgICAgICAgICAgICAgcnVsZS5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgbG9nZ2VyLnZlcmJvc2UoYFJlbW92ZWQgZGVzY2VuZGFudCBydWxlICR7cnVsZS5zZWxlY3Rvcn1gKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGZvciAoY29uc3QgY3Igb2YgZGVzY2VuZGFudFJlc3VsdC5jb252ZXJzaW9uUmVzdWx0cykge1xuICAgICAgICAgICAgICAgIGlmIChjci5jb252ZXJ0ZWQpIHtcbiAgICAgICAgICAgICAgICAgIHJ1bGUud2Fsa0RlY2xzKChkZWNsKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkZWNsLnByb3AgPT09IGNyLmRlY2xhcmF0aW9uLnByb3BlcnR5ICYmIGRlY2wudmFsdWUgPT09IGNyLmRlY2xhcmF0aW9uLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgZGVjbC5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGxvZ2dlci52ZXJib3NlKGBQYXJ0aWFsIGNvbnZlcnNpb24gb2YgZGVzY2VuZGFudCBydWxlYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNpbXBsZVJlc3VsdCA9IHRoaXMucHJvY2Vzc1NpbXBsZVJ1bGUocnVsZSk7XG4gICAgICAgIFxuICAgICAgICBpZiAoIXNpbXBsZVJlc3VsdCkge1xuICAgICAgICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlRGVzY2VuZGFudFNlbGVjdG9yKHJ1bGUuc2VsZWN0b3IpO1xuICAgICAgICAgIGlmIChwYXJzZWQuaXNDb21wbGV4KSB7XG4gICAgICAgICAgICB3YXJuaW5ncy5wdXNoKHBhcnNlZC5yZWFzb24gfHwgYFNraXBwZWQgY29tcGxleCBzZWxlY3RvcjogJHtydWxlLnNlbGVjdG9yfWApO1xuICAgICAgICAgICAgbG9nZ2VyLnZlcmJvc2UoYFNraXBwaW5nIGNvbXBsZXggc2VsZWN0b3I6ICR7cnVsZS5zZWxlY3Rvcn1gKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgcGFyc2VkU2VsZWN0b3JzID0gcGFyc2VNdWx0aXBsZVNlbGVjdG9ycyhydWxlLnNlbGVjdG9yKTtcbiAgICAgICAgICAgIGNvbnN0IGFsbENvbXBsZXggPSBwYXJzZWRTZWxlY3RvcnMuZXZlcnkocyA9PiBzLmlzQ29tcGxleCk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmIChhbGxDb21wbGV4KSB7XG4gICAgICAgICAgICAgIGNvbnN0IHJlYXNvbnMgPSBwYXJzZWRTZWxlY3RvcnMubWFwKHMgPT4gcy5yZWFzb24pLmZpbHRlcihCb29sZWFuKTtcbiAgICAgICAgICAgICAgd2FybmluZ3MucHVzaCguLi5yZWFzb25zIGFzIHN0cmluZ1tdKTtcbiAgICAgICAgICAgICAgbG9nZ2VyLnZlcmJvc2UoYFNraXBwaW5nIGNvbXBsZXggc2VsZWN0b3I6ICR7cnVsZS5zZWxlY3Rvcn1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgcnVsZXMucHVzaCguLi5zaW1wbGVSZXN1bHQuY3NzUnVsZXMpO1xuICAgICAgICB3YXJuaW5ncy5wdXNoKC4uLnNpbXBsZVJlc3VsdC5jb252ZXJzaW9uV2FybmluZ3MpO1xuXG4gICAgICAgIGNvbnN0IGFueUNvbnZlcnRlZCA9IHNpbXBsZVJlc3VsdC5jc3NSdWxlcy5zb21lKHIgPT4gci5jb252ZXJ0ZWRDbGFzc2VzLmxlbmd0aCA+IDApO1xuICAgICAgICBpZiAoYW55Q29udmVydGVkKSB7XG4gICAgICAgICAgaGFzQ2hhbmdlcyA9IHRydWU7XG5cbiAgICAgICAgICBjb25zdCBhbGxGdWxseUNvbnZlcnRlZCA9IHNpbXBsZVJlc3VsdC5jc3NSdWxlcy5ldmVyeShyID0+IHIuZnVsbHlDb252ZXJ0ZWQpO1xuICAgICAgICAgIGlmIChhbGxGdWxseUNvbnZlcnRlZCkge1xuICAgICAgICAgICAgcnVsZS5yZW1vdmUoKTtcbiAgICAgICAgICAgIGNvbnN0IGNsYXNzTmFtZXMgPSBzaW1wbGVSZXN1bHQuY3NzUnVsZXMubWFwKHIgPT4gci5jbGFzc05hbWUpLmpvaW4oJywgLicpO1xuICAgICAgICAgICAgbG9nZ2VyLnZlcmJvc2UoYFJlbW92ZWQgcnVsZSAuJHtjbGFzc05hbWVzfSAoYWxsIGRlY2xhcmF0aW9ucyBjb252ZXJ0ZWQpYCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgY3Igb2Ygc2ltcGxlUmVzdWx0LmNvbnZlcnNpb25SZXN1bHRzLmZsYXQoKSkge1xuICAgICAgICAgICAgICBpZiAoY3IuY29udmVydGVkKSB7XG4gICAgICAgICAgICAgICAgcnVsZS53YWxrRGVjbHMoKGRlY2wpID0+IHtcbiAgICAgICAgICAgICAgICAgIGlmIChkZWNsLnByb3AgPT09IGNyLmRlY2xhcmF0aW9uLnByb3BlcnR5ICYmIGRlY2wudmFsdWUgPT09IGNyLmRlY2xhcmF0aW9uLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlY2wucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxvZ2dlci52ZXJib3NlKGBQYXJ0aWFsIGNvbnZlcnNpb24gb2YgcnVsZWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHJvb3Qud2Fsa0F0UnVsZXMoKGF0UnVsZSkgPT4ge1xuICAgICAgICBpZiAoYXRSdWxlLm5vZGVzICYmIGF0UnVsZS5ub2Rlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBhdFJ1bGUucmVtb3ZlKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBjYW5EZWxldGUgPSByb290Lm5vZGVzLmxlbmd0aCA9PT0gMDtcbiAgICAgIGNvbnN0IG5ld0NzcyA9IHJvb3QudG9TdHJpbmcoKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY3NzOiBuZXdDc3MsXG4gICAgICAgIHJ1bGVzLFxuICAgICAgICBoYXNDaGFuZ2VzLFxuICAgICAgICBjYW5EZWxldGUsXG4gICAgICAgIHdhcm5pbmdzXG4gICAgICB9O1xuXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIHBhcnNlIENTUyAke2ZpbGVQYXRofTpgLCBlcnJvcik7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENTUyBwYXJzaW5nIGZhaWxlZDogJHtlcnJvcn1gKTtcbiAgICB9XG4gIH1cblxuICBwYXJzZUludGVybmFsU3R5bGUoaHRtbDogc3RyaW5nKTogeyBcbiAgICBzdHlsZXM6IEFycmF5PHsgY29udGVudDogc3RyaW5nOyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9PjtcbiAgICB3YXJuaW5nczogc3RyaW5nW107XG4gIH0ge1xuICAgIGNvbnN0IHN0eWxlczogQXJyYXk8eyBjb250ZW50OiBzdHJpbmc7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH0+ID0gW107XG4gICAgY29uc3Qgd2FybmluZ3M6IHN0cmluZ1tdID0gW107XG5cbiAgICBjb25zdCBzdHlsZVJlZ2V4ID0gLzxzdHlsZVtePl0qPihbXFxzXFxTXSo/KTxcXC9zdHlsZT4vZ2k7XG4gICAgbGV0IG1hdGNoO1xuXG4gICAgd2hpbGUgKChtYXRjaCA9IHN0eWxlUmVnZXguZXhlYyhodG1sKSkgIT09IG51bGwpIHtcbiAgICAgIHN0eWxlcy5wdXNoKHtcbiAgICAgICAgY29udGVudDogbWF0Y2hbMV0udHJpbSgpLFxuICAgICAgICBzdGFydDogbWF0Y2guaW5kZXgsXG4gICAgICAgIGVuZDogbWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGhcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB7IHN0eWxlcywgd2FybmluZ3MgfTtcbiAgfVxuXG4gIGFzeW5jIHBhcnNlSW50ZXJuYWxDU1MoaHRtbDogc3RyaW5nLCBmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx7XG4gICAgaHRtbDogc3RyaW5nO1xuICAgIHJ1bGVzOiBDU1NSdWxlW107XG4gICAgaGFzQ2hhbmdlczogYm9vbGVhbjtcbiAgICB3YXJuaW5nczogc3RyaW5nW107XG4gIH0+IHtcbiAgICBjb25zdCBhbGxSdWxlczogQ1NTUnVsZVtdID0gW107XG4gICAgY29uc3QgYWxsV2FybmluZ3M6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IG1vZGlmaWVkSHRtbCA9IGh0bWw7XG4gICAgbGV0IGhhc0NoYW5nZXMgPSBmYWxzZTtcblxuICAgIGNvbnN0IHsgc3R5bGVzIH0gPSB0aGlzLnBhcnNlSW50ZXJuYWxTdHlsZShodG1sKTtcblxuICAgIGZvciAobGV0IGkgPSBzdHlsZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGNvbnN0IHN0eWxlID0gc3R5bGVzW2ldO1xuICAgICAgXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnBhcnNlKHN0eWxlLmNvbnRlbnQsIGZpbGVQYXRoKTtcbiAgICAgICAgXG4gICAgICAgIGFsbFJ1bGVzLnB1c2goLi4ucmVzdWx0LnJ1bGVzKTtcbiAgICAgICAgYWxsV2FybmluZ3MucHVzaCguLi5yZXN1bHQud2FybmluZ3MpO1xuXG4gICAgICAgIGlmIChyZXN1bHQuaGFzQ2hhbmdlcykge1xuICAgICAgICAgIGhhc0NoYW5nZXMgPSB0cnVlO1xuXG4gICAgICAgICAgaWYgKHJlc3VsdC5jYW5EZWxldGUgfHwgcmVzdWx0LmNzcy50cmltKCkgPT09ICcnKSB7XG4gICAgICAgICAgICBtb2RpZmllZEh0bWwgPSBtb2RpZmllZEh0bWwuc2xpY2UoMCwgc3R5bGUuc3RhcnQpICsgbW9kaWZpZWRIdG1sLnNsaWNlKHN0eWxlLmVuZCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGJlZm9yZSA9IG1vZGlmaWVkSHRtbC5zbGljZSgwLCBzdHlsZS5zdGFydCk7XG4gICAgICAgICAgICBjb25zdCBhZnRlciA9IG1vZGlmaWVkSHRtbC5zbGljZShzdHlsZS5lbmQpO1xuICAgICAgICAgICAgY29uc3QgdGFnU3RhcnQgPSBodG1sLnNsaWNlKHN0eWxlLnN0YXJ0KS5tYXRjaCgvPHN0eWxlW14+XSo+Lyk/LlswXSB8fCAnPHN0eWxlPic7XG4gICAgICAgICAgICBjb25zdCB0YWdFbmQgPSAnPC9zdHlsZT4nO1xuICAgICAgICAgICAgbW9kaWZpZWRIdG1sID0gYmVmb3JlICsgdGFnU3RhcnQgKyAnXFxuJyArIHJlc3VsdC5jc3MgKyAnXFxuJyArIHRhZ0VuZCArIGFmdGVyO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYEZhaWxlZCB0byBwYXJzZSBpbnRlcm5hbCBzdHlsZSBibG9jazogJHtlcnJvcn1gKTtcbiAgICAgICAgYWxsV2FybmluZ3MucHVzaChgRmFpbGVkIHRvIHBhcnNlIGludGVybmFsIHN0eWxlOiAke2Vycm9yfWApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBodG1sOiBtb2RpZmllZEh0bWwsXG4gICAgICBydWxlczogYWxsUnVsZXMsXG4gICAgICBoYXNDaGFuZ2VzLFxuICAgICAgd2FybmluZ3M6IGFsbFdhcm5pbmdzXG4gICAgfTtcbiAgfVxuXG4gIGV4dHJhY3RJbXBvcnRQYXRocyhjb2RlOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgaW1wb3J0czogc3RyaW5nW10gPSBbXTtcbiAgICBcbiAgICBjb25zdCBpbXBvcnRSZWdleCA9IC9pbXBvcnRcXHMrWydcIl0oW14nXCJdK1xcLmNzcylbJ1wiXTs/L2c7XG4gICAgbGV0IG1hdGNoO1xuICAgIFxuICAgIHdoaWxlICgobWF0Y2ggPSBpbXBvcnRSZWdleC5leGVjKGNvZGUpKSAhPT0gbnVsbCkge1xuICAgICAgaW1wb3J0cy5wdXNoKG1hdGNoWzFdKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXF1aXJlUmVnZXggPSAvcmVxdWlyZVxccypcXChcXHMqWydcIl0oW14nXCJdK1xcLmNzcylbJ1wiXVxccypcXCkvZztcbiAgICB3aGlsZSAoKG1hdGNoID0gcmVxdWlyZVJlZ2V4LmV4ZWMoY29kZSkpICE9PSBudWxsKSB7XG4gICAgICBpbXBvcnRzLnB1c2gobWF0Y2hbMV0pO1xuICAgIH1cblxuICAgIHJldHVybiBpbXBvcnRzO1xuICB9XG59Il19
|
package/dist/index.d.ts
CHANGED
|
@@ -2,8 +2,12 @@ export { scanProject, ScannedFile } from './scanner';
|
|
|
2
2
|
export { transformFiles, TransformOptions, TransformResults } from './transformer';
|
|
3
3
|
export { TailwindMapper, CSSProperty, ConversionResult } from './tailwindMapper';
|
|
4
4
|
export { JSXParser, JSXTransformation, JSXParseResult } from './jsxParser';
|
|
5
|
-
export { CSSParser, CSSRule, CSSParseResult, UtilityWithVariant } from './cssParser';
|
|
5
|
+
export { CSSParser, CSSRule, CSSParseResult, UtilityWithVariant, SelectorTarget } from './cssParser';
|
|
6
6
|
export { FileWriter, FileWriteOptions } from './fileWriter';
|
|
7
7
|
export { loadTailwindConfig, TailwindConfig } from './utils/config';
|
|
8
8
|
export { logger } from './utils/logger';
|
|
9
9
|
export { Breakpoint, MediaQueryInfo, getDefaultBreakpoints, resolveBreakpointsFromConfig, parseMediaQuery, findBreakpointForMinWidth, processMediaQuery, prefixWithBreakpoint } from './utils/breakpointResolver';
|
|
10
|
+
export { ParsedSelector, PSEUDO_TO_VARIANT, SUPPORTED_PSEUDOS, parseSelector, mapPseudoToVariant, processPseudoSelector, parseMultipleSelectors } from './utils/pseudoSelectorResolver';
|
|
11
|
+
export { VARIANT_ORDER, isResponsiveVariant, isPseudoVariant, sortVariants, deduplicateVariants, normalizeVariantOrder, assembleUtility, assembleUtilities, mergeUtilities, MergedUtility } from './utils/variantAssembler';
|
|
12
|
+
export { DescendantSelector, SelectorPart, SelectorType, parseDescendantSelector, isDescendantSelector, isSimpleSelector, processDescendantSelector, isHtmlElement } from './utils/descendantSelectorResolver';
|
|
13
|
+
export { transformDescendantSelectors, DescendantTransformResult, groupDescendantRulesByParent } from './jsxDescendantTransformer';
|