@gallop.software/canon 2.2.1 → 2.3.1
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/eslint/index.d.ts
CHANGED
|
@@ -17,23 +17,17 @@ declare const plugin: {
|
|
|
17
17
|
'prefer-layout-components': import("eslint").Rule.RuleModule;
|
|
18
18
|
'background-image-rounded': import("eslint").Rule.RuleModule;
|
|
19
19
|
};
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
readonly 'gallop/no-container-in-section': "warn";
|
|
32
|
-
readonly 'gallop/prefer-component-props': "warn";
|
|
33
|
-
readonly 'gallop/prefer-typography-components': "warn";
|
|
34
|
-
readonly 'gallop/prefer-layout-components': "warn";
|
|
35
|
-
readonly 'gallop/background-image-rounded': "warn";
|
|
36
|
-
};
|
|
20
|
+
/**
|
|
21
|
+
* Recommended rule configurations - spread into your ESLint config
|
|
22
|
+
* @example rules: { ...gallop.recommended }
|
|
23
|
+
*/
|
|
24
|
+
recommended: {
|
|
25
|
+
readonly 'gallop/no-client-blocks': "warn";
|
|
26
|
+
readonly 'gallop/no-container-in-section': "warn";
|
|
27
|
+
readonly 'gallop/prefer-component-props': "warn";
|
|
28
|
+
readonly 'gallop/prefer-typography-components': "warn";
|
|
29
|
+
readonly 'gallop/prefer-layout-components': "warn";
|
|
30
|
+
readonly 'gallop/background-image-rounded': "warn";
|
|
37
31
|
};
|
|
38
32
|
};
|
|
39
33
|
export default plugin;
|
package/dist/eslint/index.js
CHANGED
|
@@ -4,12 +4,21 @@ import preferComponentProps from './rules/prefer-component-props.js';
|
|
|
4
4
|
import preferTypographyComponents from './rules/prefer-typography-components.js';
|
|
5
5
|
import preferLayoutComponents from './rules/prefer-layout-components.js';
|
|
6
6
|
import backgroundImageRounded from './rules/background-image-rounded.js';
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
/**
|
|
8
|
+
* All Canon ESLint rules with recommended severity levels
|
|
9
|
+
*/
|
|
10
|
+
const recommended = {
|
|
11
|
+
'gallop/no-client-blocks': 'warn',
|
|
12
|
+
'gallop/no-container-in-section': 'warn',
|
|
13
|
+
'gallop/prefer-component-props': 'warn',
|
|
14
|
+
'gallop/prefer-typography-components': 'warn',
|
|
15
|
+
'gallop/prefer-layout-components': 'warn',
|
|
16
|
+
'gallop/background-image-rounded': 'warn',
|
|
17
|
+
};
|
|
9
18
|
const plugin = {
|
|
10
19
|
meta: {
|
|
11
20
|
name: 'eslint-plugin-gallop',
|
|
12
|
-
version: '
|
|
21
|
+
version: '2.3.0',
|
|
13
22
|
},
|
|
14
23
|
rules: {
|
|
15
24
|
'no-client-blocks': noClientBlocks,
|
|
@@ -19,10 +28,11 @@ const plugin = {
|
|
|
19
28
|
'prefer-layout-components': preferLayoutComponents,
|
|
20
29
|
'background-image-rounded': backgroundImageRounded,
|
|
21
30
|
},
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
31
|
+
/**
|
|
32
|
+
* Recommended rule configurations - spread into your ESLint config
|
|
33
|
+
* @example rules: { ...gallop.recommended }
|
|
34
|
+
*/
|
|
35
|
+
recommended,
|
|
26
36
|
};
|
|
27
37
|
export default plugin;
|
|
28
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
38
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZXNsaW50L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sY0FBYyxNQUFNLDZCQUE2QixDQUFBO0FBQ3hELE9BQU8sb0JBQW9CLE1BQU0sb0NBQW9DLENBQUE7QUFDckUsT0FBTyxvQkFBb0IsTUFBTSxtQ0FBbUMsQ0FBQTtBQUNwRSxPQUFPLDBCQUEwQixNQUFNLHlDQUF5QyxDQUFBO0FBQ2hGLE9BQU8sc0JBQXNCLE1BQU0scUNBQXFDLENBQUE7QUFDeEUsT0FBTyxzQkFBc0IsTUFBTSxxQ0FBcUMsQ0FBQTtBQUV4RTs7R0FFRztBQUNILE1BQU0sV0FBVyxHQUFHO0lBQ2xCLHlCQUF5QixFQUFFLE1BQU07SUFDakMsZ0NBQWdDLEVBQUUsTUFBTTtJQUN4QywrQkFBK0IsRUFBRSxNQUFNO0lBQ3ZDLHFDQUFxQyxFQUFFLE1BQU07SUFDN0MsaUNBQWlDLEVBQUUsTUFBTTtJQUN6QyxpQ0FBaUMsRUFBRSxNQUFNO0NBQ2pDLENBQUE7QUFFVixNQUFNLE1BQU0sR0FBRztJQUNiLElBQUksRUFBRTtRQUNKLElBQUksRUFBRSxzQkFBc0I7UUFDNUIsT0FBTyxFQUFFLE9BQU87S0FDakI7SUFDRCxLQUFLLEVBQUU7UUFDTCxrQkFBa0IsRUFBRSxjQUFjO1FBQ2xDLHlCQUF5QixFQUFFLG9CQUFvQjtRQUMvQyx3QkFBd0IsRUFBRSxvQkFBb0I7UUFDOUMsOEJBQThCLEVBQUUsMEJBQTBCO1FBQzFELDBCQUEwQixFQUFFLHNCQUFzQjtRQUNsRCwwQkFBMEIsRUFBRSxzQkFBc0I7S0FDbkQ7SUFDRDs7O09BR0c7SUFDSCxXQUFXO0NBQ1osQ0FBQTtBQUVELGVBQWUsTUFBTSxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IG5vQ2xpZW50QmxvY2tzIGZyb20gJy4vcnVsZXMvbm8tY2xpZW50LWJsb2Nrcy5qcydcbmltcG9ydCBub0NvbnRhaW5lckluU2VjdGlvbiBmcm9tICcuL3J1bGVzL25vLWNvbnRhaW5lci1pbi1zZWN0aW9uLmpzJ1xuaW1wb3J0IHByZWZlckNvbXBvbmVudFByb3BzIGZyb20gJy4vcnVsZXMvcHJlZmVyLWNvbXBvbmVudC1wcm9wcy5qcydcbmltcG9ydCBwcmVmZXJUeXBvZ3JhcGh5Q29tcG9uZW50cyBmcm9tICcuL3J1bGVzL3ByZWZlci10eXBvZ3JhcGh5LWNvbXBvbmVudHMuanMnXG5pbXBvcnQgcHJlZmVyTGF5b3V0Q29tcG9uZW50cyBmcm9tICcuL3J1bGVzL3ByZWZlci1sYXlvdXQtY29tcG9uZW50cy5qcydcbmltcG9ydCBiYWNrZ3JvdW5kSW1hZ2VSb3VuZGVkIGZyb20gJy4vcnVsZXMvYmFja2dyb3VuZC1pbWFnZS1yb3VuZGVkLmpzJ1xuXG4vKipcbiAqIEFsbCBDYW5vbiBFU0xpbnQgcnVsZXMgd2l0aCByZWNvbW1lbmRlZCBzZXZlcml0eSBsZXZlbHNcbiAqL1xuY29uc3QgcmVjb21tZW5kZWQgPSB7XG4gICdnYWxsb3Avbm8tY2xpZW50LWJsb2Nrcyc6ICd3YXJuJyxcbiAgJ2dhbGxvcC9uby1jb250YWluZXItaW4tc2VjdGlvbic6ICd3YXJuJyxcbiAgJ2dhbGxvcC9wcmVmZXItY29tcG9uZW50LXByb3BzJzogJ3dhcm4nLFxuICAnZ2FsbG9wL3ByZWZlci10eXBvZ3JhcGh5LWNvbXBvbmVudHMnOiAnd2FybicsXG4gICdnYWxsb3AvcHJlZmVyLWxheW91dC1jb21wb25lbnRzJzogJ3dhcm4nLFxuICAnZ2FsbG9wL2JhY2tncm91bmQtaW1hZ2Utcm91bmRlZCc6ICd3YXJuJyxcbn0gYXMgY29uc3RcblxuY29uc3QgcGx1Z2luID0ge1xuICBtZXRhOiB7XG4gICAgbmFtZTogJ2VzbGludC1wbHVnaW4tZ2FsbG9wJyxcbiAgICB2ZXJzaW9uOiAnMi4zLjAnLFxuICB9LFxuICBydWxlczoge1xuICAgICduby1jbGllbnQtYmxvY2tzJzogbm9DbGllbnRCbG9ja3MsXG4gICAgJ25vLWNvbnRhaW5lci1pbi1zZWN0aW9uJzogbm9Db250YWluZXJJblNlY3Rpb24sXG4gICAgJ3ByZWZlci1jb21wb25lbnQtcHJvcHMnOiBwcmVmZXJDb21wb25lbnRQcm9wcyxcbiAgICAncHJlZmVyLXR5cG9ncmFwaHktY29tcG9uZW50cyc6IHByZWZlclR5cG9ncmFwaHlDb21wb25lbnRzLFxuICAgICdwcmVmZXItbGF5b3V0LWNvbXBvbmVudHMnOiBwcmVmZXJMYXlvdXRDb21wb25lbnRzLFxuICAgICdiYWNrZ3JvdW5kLWltYWdlLXJvdW5kZWQnOiBiYWNrZ3JvdW5kSW1hZ2VSb3VuZGVkLFxuICB9LFxuICAvKipcbiAgICogUmVjb21tZW5kZWQgcnVsZSBjb25maWd1cmF0aW9ucyAtIHNwcmVhZCBpbnRvIHlvdXIgRVNMaW50IGNvbmZpZ1xuICAgKiBAZXhhbXBsZSBydWxlczogeyAuLi5nYWxsb3AucmVjb21tZW5kZWQgfVxuICAgKi9cbiAgcmVjb21tZW5kZWQsXG59XG5cbmV4cG9ydCBkZWZhdWx0IHBsdWdpblxuIl19
|
|
@@ -44,28 +44,47 @@ const rule = {
|
|
|
44
44
|
}
|
|
45
45
|
parent = parent.parent;
|
|
46
46
|
}
|
|
47
|
-
// Check className for text
|
|
48
|
-
let hasTextClasses = false;
|
|
47
|
+
// Check className for gradient text (skip these)
|
|
49
48
|
let isGradientText = false;
|
|
49
|
+
let isVisualElement = false;
|
|
50
50
|
node.attributes?.forEach((attr) => {
|
|
51
51
|
if (attr.type === 'JSXAttribute' && attr.name?.name === 'className') {
|
|
52
52
|
const value = attr.value?.value || '';
|
|
53
|
-
// Check for text-related Tailwind classes
|
|
54
|
-
if (/\b(text-|font-|leading-|tracking-)/.test(value)) {
|
|
55
|
-
hasTextClasses = true;
|
|
56
|
-
}
|
|
57
53
|
// Skip gradient text spans (bg-clip-text is used for gradient text effects)
|
|
58
54
|
if (/\bbg-clip-text\b/.test(value)) {
|
|
59
55
|
isGradientText = true;
|
|
60
56
|
}
|
|
57
|
+
// Skip visual elements (dots, decorative elements with w-/h- but no text)
|
|
58
|
+
if (/\b(w-\d|h-\d|rounded-full)\b/.test(value) && !/\btext-/.test(value)) {
|
|
59
|
+
isVisualElement = true;
|
|
60
|
+
}
|
|
61
61
|
}
|
|
62
62
|
});
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
63
|
+
if (isGradientText) {
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
// Check if span contains text content
|
|
67
|
+
const jsxElement = node.parent;
|
|
68
|
+
if (jsxElement?.type === 'JSXElement') {
|
|
69
|
+
const children = jsxElement.children || [];
|
|
70
|
+
const hasTextContent = children.some((child) => {
|
|
71
|
+
// Check for direct text content
|
|
72
|
+
if (child.type === 'JSXText') {
|
|
73
|
+
return child.value.trim().length > 0;
|
|
74
|
+
}
|
|
75
|
+
// Check for expression with literal string
|
|
76
|
+
if (child.type === 'JSXExpressionContainer' && child.expression?.type === 'Literal') {
|
|
77
|
+
return typeof child.expression.value === 'string' && child.expression.value.trim().length > 0;
|
|
78
|
+
}
|
|
79
|
+
return false;
|
|
68
80
|
});
|
|
81
|
+
// Warn if span has text content and is not a visual element
|
|
82
|
+
if (hasTextContent && !isVisualElement) {
|
|
83
|
+
context.report({
|
|
84
|
+
node,
|
|
85
|
+
messageId: 'useSpan',
|
|
86
|
+
});
|
|
87
|
+
}
|
|
69
88
|
}
|
|
70
89
|
}
|
|
71
90
|
},
|
|
@@ -73,4 +92,4 @@ const rule = {
|
|
|
73
92
|
},
|
|
74
93
|
};
|
|
75
94
|
export default rule;
|
|
76
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
95
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJlZmVyLXR5cG9ncmFwaHktY29tcG9uZW50cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9lc2xpbnQvcnVsZXMvcHJlZmVyLXR5cG9ncmFwaHktY29tcG9uZW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsV0FBVyxFQUFFLGVBQWUsRUFBRSxNQUFNLG1CQUFtQixDQUFBO0FBRWhFLE1BQU0sU0FBUyxHQUFHLDhCQUE4QixDQUFBO0FBQ2hELE1BQU0sT0FBTyxHQUFHLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQTtBQUUxQyxNQUFNLElBQUksR0FBb0I7SUFDNUIsSUFBSSxFQUFFO1FBQ0osSUFBSSxFQUFFLFlBQVk7UUFDbEIsSUFBSSxFQUFFO1lBQ0osV0FBVyxFQUFFLE9BQU8sRUFBRSxPQUFPLElBQUksa0NBQWtDO1lBQ25FLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLEdBQUcsRUFBRSxXQUFXLENBQUMsU0FBUyxDQUFDO1NBQzVCO1FBQ0QsUUFBUSxFQUFFO1lBQ1IsWUFBWSxFQUFFLFVBQVUsT0FBTyxFQUFFLEVBQUUsSUFBSSxLQUFLLGdHQUFnRztZQUM1SSxPQUFPLEVBQUUsVUFBVSxPQUFPLEVBQUUsRUFBRSxJQUFJLEtBQUssMEdBQTBHO1NBQ2xKO1FBQ0QsTUFBTSxFQUFFLEVBQUU7S0FDWDtJQUVELE1BQU0sQ0FBQyxPQUFPO1FBQ1osTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLFFBQVEsSUFBSSxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUE7UUFFMUQsNEJBQTRCO1FBQzVCLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7WUFDbkMsT0FBTyxFQUFFLENBQUE7UUFDWCxDQUFDO1FBRUQsT0FBTztZQUNMLGlCQUFpQixDQUFDLElBQVM7Z0JBQ3pCLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFBO2dCQUVu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RixDQUFDOzRCQUNELE9BQU8sS0FBSyxDQUFBO3dCQUNkLENBQUMsQ0FBQyxDQUFBO3dCQUVGLDREQUE0RDt3QkFDNUQsSUFBSSxjQUFjLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQzs0QkFDdkMsT0FBTyxDQUFDLE1BQU0sQ0FBQztnQ0FDYixJQUFJO2dDQUNKLFNBQVMsRUFBRSxTQUFTOzZCQUNyQixDQUFDLENBQUE7d0JBQ0osQ0FBQztvQkFDSCxDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDO1NBQ0YsQ0FBQTtJQUNILENBQUM7Q0FDRixDQUFBO0FBRUQsZUFBZSxJQUFJLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFJ1bGUgfSBmcm9tICdlc2xpbnQnXG5pbXBvcnQgeyBnZXRDYW5vblVybCwgZ2V0Q2Fub25QYXR0ZXJuIH0gZnJvbSAnLi4vdXRpbHMvY2Fub24uanMnXG5cbmNvbnN0IFJVTEVfTkFNRSA9ICdwcmVmZXItdHlwb2dyYXBoeS1jb21wb25lbnRzJ1xuY29uc3QgcGF0dGVybiA9IGdldENhbm9uUGF0dGVybihSVUxFX05BTUUpXG5cbmNvbnN0IHJ1bGU6IFJ1bGUuUnVsZU1vZHVsZSA9IHtcbiAgbWV0YToge1xuICAgIHR5cGU6ICdzdWdnZXN0aW9uJyxcbiAgICBkb2NzOiB7XG4gICAgICBkZXNjcmlwdGlvbjogcGF0dGVybj8uc3VtbWFyeSB8fCAnVXNlIFBhcmFncmFwaC9TcGFuLCBub3QgcmF3IHRhZ3MnLFxuICAgICAgcmVjb21tZW5kZWQ6IHRydWUsXG4gICAgICB1cmw6IGdldENhbm9uVXJsKFJVTEVfTkFNRSksXG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgdXNlUGFyYWdyYXBoOiBgW0Nhbm9uICR7cGF0dGVybj8uaWQgfHwgJzAwMyd9XSBVc2UgdGhlIFBhcmFncmFwaCBjb21wb25lbnQgaW5zdGVhZCBvZiA8cD4uIEltcG9ydDogaW1wb3J0IHsgUGFyYWdyYXBoIH0gZnJvbSBcIkAvY29tcG9uZW50c1wiYCxcbiAgICAgIHVzZVNwYW46IGBbQ2Fub24gJHtwYXR0ZXJuPy5pZCB8fCAnMDAzJ31dIFVzZSB0aGUgU3BhbiBjb21wb25lbnQgaW5zdGVhZCBvZiA8c3Bhbj4gZm9yIHRleHQgY29udGVudC4gSW1wb3J0OiBpbXBvcnQgeyBTcGFuIH0gZnJvbSBcIkAvY29tcG9uZW50c1wiYCxcbiAgICB9LFxuICAgIHNjaGVtYTogW10sXG4gIH0sXG5cbiAgY3JlYXRlKGNvbnRleHQpIHtcbiAgICBjb25zdCBmaWxlbmFtZSA9IGNvbnRleHQuZmlsZW5hbWUgfHwgY29udGV4dC5nZXRGaWxlbmFtZSgpXG5cbiAgICAvLyBPbmx5IGFwcGx5IHRvIGJsb2NrIGZpbGVzXG4gICAgaWYgKCFmaWxlbmFtZS5pbmNsdWRlcygnL2Jsb2Nrcy8nKSkge1xuICAgICAgcmV0dXJuIHt9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIEpTWE9wZW5pbmdFbGVtZW50KG5vZGU6IGFueSkge1xuICAgICAgICBjb25zdCBlbGVtZW50TmFtZSA9IG5vZGUubmFtZT8ubmFtZVxuXG4gICAgICAgIGlmIChlbGVtZW50TmFtZSA9PT0gJ3AnKSB7XG4gICAgICAgICAgY29udGV4dC5yZXBvcnQoe1xuICAgICAgICAgICAgbm9kZSxcbiAgICAgICAgICAgIG1lc3NhZ2VJZDogJ3VzZVBhcmFncmFwaCcsXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlbGVtZW50TmFtZSA9PT0gJ3NwYW4nKSB7XG4gICAgICAgICAgLy8gU2tpcCBzcGFucyB0aGF0IGFyZSBpbnNpZGUgdHlwb2dyYXBoeSBjb21wb25lbnRzIChIZWFkaW5nLCBQYXJhZ3JhcGgsIExhYmVsLCBldGMuKVxuICAgICAgICAgIC8vIFRoZXNlIGFyZSB1c2VkIGZvciBpbmxpbmUgc3R5bGluZyBlZmZlY3RzIGxpa2UgZ3JhZGllbnQgdGV4dCwgZW1waGFzaXMsIGV0Yy5cbiAgICAgICAgICBjb25zdCB0eXBvZ3JhcGh5Q29tcG9uZW50cyA9IFsnSGVhZGluZycsICdQYXJhZ3JhcGgnLCAnTGFiZWwnLCAnU3BhbicsICdRdW90ZScsICdTdWJoZWFkaW5nJywgJ0FjY2VudCddXG4gICAgICAgICAgXG4gICAgICAgICAgbGV0IHBhcmVudCA9IG5vZGUucGFyZW50XG4gICAgICAgICAgd2hpbGUgKHBhcmVudCkge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBwYXJlbnQudHlwZSA9PT0gJ0pTWEVsZW1lbnQnICYmXG4gICAgICAgICAgICAgIHBhcmVudC5vcGVuaW5nRWxlbWVudD8ubmFtZT8ubmFtZSAmJlxuICAgICAgICAgICAgICB0eXBvZ3JhcGh5Q29tcG9uZW50cy5pbmNsdWRlcyhwYXJlbnQub3BlbmluZ0VsZW1lbnQubmFtZS5uYW1lKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIC8vIFNwYW4gaXMgaW5zaWRlIGEgdHlwb2dyYXBoeSBjb21wb25lbnQsIHNraXAgd2FybmluZ1xuICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnRcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBDaGVjayBjbGFzc05hbWUgZm9yIGdyYWRpZW50IHRleHQgKHNraXAgdGhlc2UpXG4gICAgICAgICAgbGV0IGlzR3JhZGllbnRUZXh0ID0gZmFsc2VcbiAgICAgICAgICBsZXQgaXNWaXN1YWxFbGVtZW50ID0gZmFsc2VcblxuICAgICAgICAgIG5vZGUuYXR0cmlidXRlcz8uZm9yRWFjaCgoYXR0cjogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAoYXR0ci50eXBlID09PSAnSlNYQXR0cmlidXRlJyAmJiBhdHRyLm5hbWU/Lm5hbWUgPT09ICdjbGFzc05hbWUnKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gYXR0ci52YWx1ZT8udmFsdWUgfHwgJydcbiAgICAgICAgICAgICAgLy8gU2tpcCBncmFkaWVudCB0ZXh0IHNwYW5zIChiZy1jbGlwLXRleHQgaXMgdXNlZCBmb3IgZ3JhZGllbnQgdGV4dCBlZmZlY3RzKVxuICAgICAgICAgICAgICBpZiAoL1xcYmJnLWNsaXAtdGV4dFxcYi8udGVzdCh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICBpc0dyYWRpZW50VGV4dCA9IHRydWVcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvLyBTa2lwIHZpc3VhbCBlbGVtZW50cyAoZG90cywgZGVjb3JhdGl2ZSBlbGVtZW50cyB3aXRoIHctL2gtIGJ1dCBubyB0ZXh0KVxuICAgICAgICAgICAgICBpZiAoL1xcYih3LVxcZHxoLVxcZHxyb3VuZGVkLWZ1bGwpXFxiLy50ZXN0KHZhbHVlKSAmJiAhL1xcYnRleHQtLy50ZXN0KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIGlzVmlzdWFsRWxlbWVudCA9IHRydWVcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG5cbiAgICAgICAgICBpZiAoaXNHcmFkaWVudFRleHQpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIENoZWNrIGlmIHNwYW4gY29udGFpbnMgdGV4dCBjb250ZW50XG4gICAgICAgICAgY29uc3QganN4RWxlbWVudCA9IG5vZGUucGFyZW50XG4gICAgICAgICAgaWYgKGpzeEVsZW1lbnQ/LnR5cGUgPT09ICdKU1hFbGVtZW50Jykge1xuICAgICAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBqc3hFbGVtZW50LmNoaWxkcmVuIHx8IFtdXG4gICAgICAgICAgICBjb25zdCBoYXNUZXh0Q29udGVudCA9IGNoaWxkcmVuLnNvbWUoKGNoaWxkOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIGRpcmVjdCB0ZXh0IGNvbnRlbnRcbiAgICAgICAgICAgICAgaWYgKGNoaWxkLnR5cGUgPT09ICdKU1hUZXh0Jykge1xuICAgICAgICAgICAgICAgIHJldHVybiBjaGlsZC52YWx1ZS50cmltKCkubGVuZ3RoID4gMFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8vIENoZWNrIGZvciBleHByZXNzaW9uIHdpdGggbGl0ZXJhbCBzdHJpbmdcbiAgICAgICAgICAgICAgaWYgKGNoaWxkLnR5cGUgPT09ICdKU1hFeHByZXNzaW9uQ29udGFpbmVyJyAmJiBjaGlsZC5leHByZXNzaW9uPy50eXBlID09PSAnTGl0ZXJhbCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHlwZW9mIGNoaWxkLmV4cHJlc3Npb24udmFsdWUgPT09ICdzdHJpbmcnICYmIGNoaWxkLmV4cHJlc3Npb24udmFsdWUudHJpbSgpLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIC8vIFdhcm4gaWYgc3BhbiBoYXMgdGV4dCBjb250ZW50IGFuZCBpcyBub3QgYSB2aXN1YWwgZWxlbWVudFxuICAgICAgICAgICAgaWYgKGhhc1RleHRDb250ZW50ICYmICFpc1Zpc3VhbEVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgY29udGV4dC5yZXBvcnQoe1xuICAgICAgICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgICAgICAgbWVzc2FnZUlkOiAndXNlU3BhbicsXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgIH1cbiAgfSxcbn1cblxuZXhwb3J0IGRlZmF1bHQgcnVsZVxuIl19
|