@fenge/eslint-config
Version:
A super strict eslint config for linting js/ts/package.json.
236 lines • 35.3 kB
JavaScript
import * as fengeTsPlugin from "@fenge/eslint-plugin-ts";
import { getJsBase } from "../js/base.js";
export function getTsBase() {
const jsBase = getJsBase();
const getTsExtensionRules = () => {
// Key is js rule, value is ts rule
// https://typescript-eslint.io/rules/?=extension
// Some rules are implemented by eslint core, so we comment them out.
const extensionRuleMap = {
// "class-methods-use-this": "@typescript-eslint/class-methods-use-this", // 9.23.0
"consistent-return": "@typescript-eslint/consistent-return",
// "default-param-last": "@typescript-eslint/default-param-last", // 9.23.0
"dot-notation": "@typescript-eslint/dot-notation",
// "init-declarations": "@typescript-eslint/init-declarations", // 9.24.0
// "max-params": "@typescript-eslint/max-params", // 9.27.0
// "no-array-constructor": "@typescript-eslint/no-array-constructor", // 9.24.0
// "no-dupe-class-members": "@typescript-eslint/no-dupe-class-members", // 9.24.0
// "no-empty-function": "@typescript-eslint/no-empty-function", // 9.25.0
"no-implied-eval": "@typescript-eslint/no-implied-eval",
// "no-invalid-this": "@typescript-eslint/no-invalid-this", // 9.25.0
// "no-loop-func": "@typescript-eslint/no-loop-func", // 9.25.0
// "no-loss-of-precision": "@typescript-eslint/no-loss-of-precision", // 9.24.0. And this rule has been deprecated
// "no-magic-numbers": "@typescript-eslint/no-magic-numbers", // 9.28.0
"no-redeclare": "@typescript-eslint/no-redeclare",
"no-restricted-imports": "@typescript-eslint/no-restricted-imports",
// "no-shadow": "@typescript-eslint/no-shadow", // 9.28.0
"no-unused-private-class-members": "@typescript-eslint/no-unused-private-class-members",
// "no-unused-expressions": "@typescript-eslint/no-unused-expressions", // 9.25.0
"no-unused-vars": "@typescript-eslint/no-unused-vars",
// "no-use-before-define": "@typescript-eslint/no-use-before-define", // 9.28.0
// "no-useless-constructor": "@typescript-eslint/no-useless-constructor", // 9.23.0
"no-throw-literal": "@typescript-eslint/only-throw-error",
"prefer-destructuring": "@typescript-eslint/prefer-destructuring",
"prefer-promise-reject-errors": "@typescript-eslint/prefer-promise-reject-errors",
"require-await": "@typescript-eslint/require-await",
"no-return-await": "@typescript-eslint/return-await", // no-return-await has been deprecated
};
const isInExtensionRuleMap = (key) => key in extensionRuleMap;
return Object.entries(jsBase.rules).reduce((result, [jsRuleKey, jsRuleValue]) => isInExtensionRuleMap(jsRuleKey)
? {
...result,
[jsRuleKey]: "off",
[extensionRuleMap[jsRuleKey]]: jsRuleValue,
}
: result, {});
};
return {
...jsBase,
name: "fenge/typescript",
files: ["**/*.{ts,cts,mts,tsx}"],
languageOptions: {
...jsBase.languageOptions,
parserOptions: {
...jsBase.languageOptions.parserOptions,
// Setting `projectService: true` or `project: true` is pretty slow when lint a monorepo with many tsconfig.json files in each sub-app.
// But setting `project: "tsconfig.json"` will cause parser error when the project root tsconfig.json is `{ extends: "fenge/tsconfig" }`
projectService: true,
},
globals: {
...jsBase.languageOptions.globals,
NodeJS: false,
},
},
plugins: {
...jsBase.plugins,
"@fenge-ts": fengeTsPlugin,
},
rules: {
...jsBase.rules,
...getTsExtensionRules(),
// fenge
"@fenge-ts/exact-map-set-type": "error",
"@fenge-ts/no-const-enum": "error",
"@fenge-ts/no-declares": "error",
"@fenge-ts/no-export-assignment": "error",
"@fenge-ts/no-misuse-spreading-parameter": "error",
"@fenge-ts/no-property-decorator": "error",
"@fenge-ts/no-untyped-empty-array": "error",
// typescript
"@typescript-eslint/adjacent-overload-signatures": "error",
// "@typescript-eslint/array-type": ["error", 'array-simple'], // The default option is 'array'. Not very sure if we need to change the option. So disabled it.
"@typescript-eslint/await-thenable": "error",
"@typescript-eslint/class-literal-property-style": "error",
"@typescript-eslint/consistent-generic-constructors": "error",
"@typescript-eslint/consistent-indexed-object-style": "error",
"@typescript-eslint/consistent-type-assertions": [
"error",
{
assertionStyle: "as",
objectLiteralTypeAssertions: "allow-as-parameter",
},
],
"@typescript-eslint/consistent-type-definitions": ["error", "interface"], // TODO should we change to 'type'?
"@typescript-eslint/consistent-type-exports": "error",
"@typescript-eslint/consistent-type-imports": "error",
"@typescript-eslint/dot-notation": ["error", { allowKeywords: true }],
"@typescript-eslint/method-signature-style": "error",
"@typescript-eslint/naming-convention": [
"error",
{
selector: "function",
format: ["camelCase", "PascalCase"],
},
{
selector: "variable",
types: ["function"],
format: ["camelCase", "PascalCase"], // decorators need PascalCase
},
{
selector: "class",
format: ["PascalCase"],
},
{
selector: "interface",
format: ["PascalCase"],
},
{
selector: "typeAlias",
format: ["PascalCase"],
},
{
selector: "typeParameter",
format: ["UPPER_CASE", "PascalCase"],
},
],
"@typescript-eslint/no-array-delete": "error",
"@typescript-eslint/no-base-to-string": [
"error",
{ ignoredTypeNames: [] },
],
"@typescript-eslint/no-confusing-non-null-assertion": "error",
"@typescript-eslint/no-confusing-void-expression": [
"error",
{ ignoreArrowShorthand: true },
],
"@typescript-eslint/no-deprecated": "error",
"@typescript-eslint/no-duplicate-enum-values": "error",
"@typescript-eslint/no-duplicate-type-constituents": "error",
"@typescript-eslint/no-empty-object-type": "error",
// "@typescript-eslint/no-explicit-any": "warn",
"@typescript-eslint/no-extra-non-null-assertion": "error",
// "@typescript-eslint/no-extraneous-class": "error", // Classes have only static member is reasonable sometimes. Nestjs modules use it a lot.
"@typescript-eslint/no-floating-promises": [
"error",
{
ignoreVoid: false,
},
],
"@typescript-eslint/no-for-in-array": "error",
"@typescript-eslint/no-import-type-side-effects": "error",
"@typescript-eslint/no-inferrable-types": "error",
"@typescript-eslint/no-invalid-void-type": "error",
"@typescript-eslint/no-misused-new": "error",
"@typescript-eslint/no-misused-promises": "error",
"@typescript-eslint/no-misused-spread": "error",
"@typescript-eslint/no-mixed-enums": "error",
"@typescript-eslint/no-namespace": [
"error",
{ allowDefinitionFiles: false },
],
"@typescript-eslint/no-non-null-asserted-nullish-coalescing": "error",
"@typescript-eslint/no-non-null-asserted-optional-chain": "error",
"@typescript-eslint/no-non-null-assertion": "error",
"@typescript-eslint/no-redundant-type-constituents": "error",
"@typescript-eslint/no-require-imports": "error",
"@typescript-eslint/no-unnecessary-boolean-literal-compare": "error",
"@typescript-eslint/no-unnecessary-condition": [
"error",
{ allowConstantLoopConditions: "only-allowed-literals" },
],
"@typescript-eslint/no-unnecessary-parameter-property-assignment": "error",
"@typescript-eslint/no-unnecessary-template-expression": "error", // js also need this rule
"@typescript-eslint/no-unnecessary-type-arguments": "error",
"@typescript-eslint/no-unnecessary-type-assertion": "error",
"@typescript-eslint/no-unnecessary-type-constraint": "error",
"@typescript-eslint/no-unnecessary-type-conversion": "error",
"@typescript-eslint/no-unsafe-call": "error",
"@typescript-eslint/no-unsafe-declaration-merging": "error",
"@typescript-eslint/no-unsafe-enum-comparison": "error",
"@typescript-eslint/no-unsafe-function-type": "error",
"@typescript-eslint/no-unsafe-return": "error", // This rule is not very perfect. See https://github.com/typescript-eslint/typescript-eslint/issues/10439
"@typescript-eslint/no-unsafe-unary-minus": "error",
"@typescript-eslint/no-useless-default-assignment": "error",
"@typescript-eslint/no-wrapper-object-types": "error",
"@typescript-eslint/non-nullable-type-assertion-style": "error",
"@typescript-eslint/only-throw-error": [
"error",
{ allowThrowingUnknown: false },
],
"@typescript-eslint/prefer-as-const": "error",
"@typescript-eslint/prefer-function-type": "error",
"@typescript-eslint/prefer-includes": "error",
"@typescript-eslint/prefer-literal-enum-member": "error",
"@typescript-eslint/prefer-namespace-keyword": "error",
"@typescript-eslint/prefer-nullish-coalescing": "error",
"@typescript-eslint/prefer-optional-chain": "error",
"@typescript-eslint/prefer-readonly": "error",
"@typescript-eslint/prefer-regexp-exec": "error",
"@typescript-eslint/prefer-return-this-type": "error",
"@typescript-eslint/promise-function-async": "error",
"@typescript-eslint/restrict-plus-operands": [
"error",
{
// allowAny: false,
allowBoolean: false,
allowNullish: false,
allowNumberAndString: false,
allowRegExp: false,
skipCompoundAssignments: false,
},
],
"@typescript-eslint/restrict-template-expressions": [
"error",
{
allow: [],
// allowAny: false,
allowBoolean: false,
allowNever: false,
allowNullish: false,
// allowNumber: false,
allowRegExp: false,
},
],
"@typescript-eslint/related-getter-setter-pairs": "error",
"@typescript-eslint/return-await": ["error", "always"],
"@typescript-eslint/switch-exhaustiveness-check": [
"error",
{ requireDefaultForNonUnion: true },
],
"@typescript-eslint/unbound-method": "error",
"@typescript-eslint/unified-signatures": "error",
"@typescript-eslint/use-unknown-in-catch-callback-variable": "error",
},
};
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb25maWcvdHMvYmFzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssYUFBYSxNQUFNLHlCQUF5QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFMUMsTUFBTSxVQUFVLFNBQVM7SUFDdkIsTUFBTSxNQUFNLEdBQUcsU0FBUyxFQUFFLENBQUM7SUFFM0IsTUFBTSxtQkFBbUIsR0FBRyxHQUFHLEVBQUU7UUFDL0IsbUNBQW1DO1FBQ25DLGlEQUFpRDtRQUNqRCxxRUFBcUU7UUFDckUsTUFBTSxnQkFBZ0IsR0FBRztZQUN2QixtRkFBbUY7WUFDbkYsbUJBQW1CLEVBQUUsc0NBQXNDO1lBQzNELDJFQUEyRTtZQUMzRSxjQUFjLEVBQUUsaUNBQWlDO1lBQ2pELHlFQUF5RTtZQUN6RSwyREFBMkQ7WUFDM0QsK0VBQStFO1lBQy9FLGlGQUFpRjtZQUNqRix5RUFBeUU7WUFDekUsaUJBQWlCLEVBQUUsb0NBQW9DO1lBQ3ZELHFFQUFxRTtZQUNyRSwrREFBK0Q7WUFDL0Qsa0hBQWtIO1lBQ2xILHVFQUF1RTtZQUN2RSxjQUFjLEVBQUUsaUNBQWlDO1lBQ2pELHVCQUF1QixFQUFFLDBDQUEwQztZQUNuRSx5REFBeUQ7WUFDekQsaUNBQWlDLEVBQy9CLG9EQUFvRDtZQUN0RCxpRkFBaUY7WUFDakYsZ0JBQWdCLEVBQUUsbUNBQW1DO1lBQ3JELCtFQUErRTtZQUMvRSxtRkFBbUY7WUFDbkYsa0JBQWtCLEVBQUUscUNBQXFDO1lBQ3pELHNCQUFzQixFQUFFLHlDQUF5QztZQUNqRSw4QkFBOEIsRUFDNUIsaURBQWlEO1lBQ25ELGVBQWUsRUFBRSxrQ0FBa0M7WUFDbkQsaUJBQWlCLEVBQUUsaUNBQWlDLEVBQUUsc0NBQXNDO1NBQ3BGLENBQUM7UUFtQlgsTUFBTSxvQkFBb0IsR0FBRyxDQUMzQixHQUFXLEVBQzJCLEVB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QUNELGtEQUFrRCxFQUFFO2dCQUNsRCxPQUFPO2dCQUNQO29CQUNFLEtBQUssRUFBRSxFQUFFO29CQUNULG1CQUFtQjtvQkFDbkIsWUFBWSxFQUFFLEtBQUs7b0JBQ25CLFVBQVUsRUFBRSxLQUFLO29CQUNqQixZQUFZLEVBQUUsS0FBSztvQkFDbkIsc0JBQXNCO29CQUN0QixXQUFXLEVBQUUsS0FBSztpQkFDbkI7YUFDRjtZQUNELGdEQUFnRCxFQUFFLE9BQU87WUFDekQsaUNBQWlDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDO1lBQ3RELGdEQUFnRCxFQUFFO2dCQUNoRCxPQUFPO2dCQUNQLEVBQUUseUJBQXlCLEVBQUUsSUFBSSxFQUFFO2FBQ3BDO1lBQ0QsbUNBQW1DLEVBQUUsT0FBTztZQUM1Qyx1Q0FBdUMsRUFBRSxPQUFPO1lBQ2hELDJEQUEyRCxFQUFFLE9BQU87U0FDckU7S0FDTyxDQUFDO0FBQ2IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGZlbmdlVHNQbHVnaW4gZnJvbSBcIkBmZW5nZS9lc2xpbnQtcGx1Z2luLXRzXCI7XG5pbXBvcnQgeyBnZXRKc0Jhc2UgfSBmcm9tIFwiLi4vanMvYmFzZS50c1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VHNCYXNlKCkge1xuICBjb25zdCBqc0Jhc2UgPSBnZXRKc0Jhc2UoKTtcblxuICBjb25zdCBnZXRUc0V4dGVuc2lvblJ1bGVzID0gKCkgPT4ge1xuICAgIC8vIEtleSBpcyBqcyBydWxlLCB2YWx1ZSBpcyB0cyBydWxlXG4gICAgLy8gaHR0cHM6Ly90eXBlc2NyaXB0LWVzbGludC5pby9ydWxlcy8/PWV4dGVuc2lvblxuICAgIC8vIFNvbWUgcnVsZXMgYXJlIGltcGxlbWVudGVkIGJ5IGVzbGludCBjb3JlLCBzbyB3ZSBjb21tZW50IHRoZW0gb3V0LlxuICAgIGNvbnN0IGV4dGVuc2lvblJ1bGVNYXAgPSB7XG4gICAgICAvLyBcImNsYXNzLW1ldGhvZHMtdXNlLXRoaXNcIjogXCJAdHlwZXNjcmlwdC1lc2xpbnQvY2xhc3MtbWV0aG9kcy11c2UtdGhpc1wiLCAvLyA5LjIzLjBcbiAgICAgIFwiY29uc2lzdGVudC1yZXR1cm5cIjogXCJAdHlwZXNjcmlwdC1lc2xpbnQvY29uc2lzdGVudC1yZXR1cm5cIixcbiAgICAgIC8vIFwiZGVmYXVsdC1wYXJhbS1sYXN0XCI6IFwiQHR5cGVzY3JpcHQtZXNsaW50L2RlZmF1bHQtcGFyYW0tbGFzdFwiLCAvLyA5LjIzLjBcbiAgICAgIFwiZG90LW5vdGF0aW9uXCI6IFwiQHR5cGVzY3JpcHQtZXNsaW50L2RvdC1ub3RhdGlvblwiLFxuICAgICAgLy8gXCJpbml0LWRlY2xhcmF0aW9uc1wiOiBcIkB0eXBlc2NyaXB0LWVzbGludC9pbml0LWRlY2xhcmF0aW9uc1wiLCAvLyA5LjI0LjBcbiAgICAgIC8vIFwibWF4LXBhcmFtc1wiOiBcIkB0eXBlc2NyaXB0LWVzbGludC9tYXgtcGFyYW1zXCIsIC8vIDkuMjcuMFxuICAgICAgLy8gXCJuby1hcnJheS1jb25zdHJ1Y3RvclwiOiBcIkB0eXBlc2NyaXB0LWVzbGludC9uby1hcnJheS1jb25zdHJ1Y3RvclwiLCAvLyA5LjI0LjBcbiAgICAgIC8vIFwibm8tZHVwZS1jbGFzcy1tZW1iZXJzXCI6IFwiQHR5cGVzY3JpcHQtZXNsaW50L25vLWR1cGUtY2xhc3MtbWVtYmVyc1wiLCAvLyA5LjI0LjBcbiAgICAgIC8vIFwibm8tZW1wdHktZnVuY3Rpb25cIjogXCJAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb25cIiwgLy8gOS4yNS4wXG4gICAgICBcIm5vLWltcGxpZWQtZXZhbFwiOiBcIkB0eXBlc2NyaXB0LWVzbGludC9uby1pbXBsaWVkLWV2YWxcIixcbiAgICAgIC8vIFwibm8taW52YWxpZC10aGlzXCI6IFwiQHR5cGVzY3JpcHQtZXNsaW50L25vLWludmFsaWQtdGhpc1wiLCAvLyA5LjI1LjBcbiAgICAgIC8vIFwibm8tbG9vcC1mdW5jXCI6IFwiQHR5cGVzY3JpcHQtZXNsaW50L25vLWxvb3AtZnVuY1wiLCAvLyA5LjI1LjBcbiAgICAgIC8vIFwibm8tbG9zcy1vZi1wcmVjaXNpb25cIjogXCJAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbG9zcy1vZi1wcmVjaXNpb25cIiwgLy8gOS4yNC4wLiBBbmQgdGhpcyBydWxlIGhhcyBiZWVuIGRlcHJlY2F0ZWRcbiAgICAgIC8vIFwibm8tbWFnaWMtbnVtYmVyc1wiOiBcIkB0eXBlc2NyaXB0LWVzbGludC9uby1tYWdpYy1udW1iZXJzXCIsIC8vIDkuMjguMFxuICAgICAgXCJuby1yZWRlY2xhcmVcIjogXCJAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVkZWNsYXJlXCIsXG4gICAgICBcIm5vLXJlc3RyaWN0ZWQtaW1wb3J0c1wiOiBcIkB0eXBlc2NyaXB0LWVzbGludC9uby1yZXN0cmljdGVkLWltcG9ydHNcIixcbiAgICAgIC8vIFwibm8tc2hhZG93XCI6IFwiQHR5cGVzY3JpcHQtZXNsaW50L25vLXNoYWRvd1wiLCAvLyA5LjI4LjBcbiAgICAgIFwibm8tdW51c2VkLXByaXZhdGUtY2xhc3MtbWVtYmVyc1wiOlxuICAgICAgICBcIkB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtcHJpdmF0ZS1jbGFzcy1tZW1iZXJzXCIsXG4gICAgICAvLyBcIm5vLXVudXNlZC1leHByZXNzaW9uc1wiOiBcIkB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtZXhwcmVzc2lvbnNcIiwgLy8gOS4yNS4wXG4gICAgICBcIm5vLXVudXNlZC12YXJzXCI6IFwiQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXCIsXG4gICAgICAvLyBcIm5vLXVzZS1iZWZvcmUtZGVmaW5lXCI6IFwiQHR5cGVzY3JpcHQtZXNsaW50L25vLXVzZS1iZWZvcmUtZGVmaW5lXCIsIC8vIDkuMjguMFxuICAgICAgLy8gXCJuby11c2VsZXNzLWNvbnN0cnVjdG9yXCI6IFwiQHR5cGVzY3JpcHQtZXNsaW50L25vLXVzZWxlc3MtY29uc3RydWN0b3JcIiwgLy8gOS4yMy4wXG4gICAgICBcIm5vLXRocm93LWxpdGVyYWxcIjogXCJAdHlwZXNjcmlwdC1lc2xpbnQvb25seS10aHJvdy1lcnJvclwiLFxuICAgICAgXCJwcmVmZXItZGVzdHJ1Y3R1cmluZ1wiOiBcIkB0eXBlc2NyaXB0LWVzbGludC9wcmVmZXItZGVzdHJ1Y3R1cmluZ1wiLFxuICAgICAgXCJwcmVmZXItcHJvbWlzZS1yZWplY3QtZXJyb3JzXCI6XG4gICAgICAgIFwiQHR5cGVzY3JpcHQtZXNsaW50L3ByZWZlci1wcm9taXNlLXJlamVjdC1lcnJvcnNcIixcbiAgICAgIFwicmVxdWlyZS1hd2FpdFwiOiBcIkB0eXBlc2NyaXB0LWVzbGludC9yZXF1aXJlLWF3YWl0XCIsXG4gICAgICBcIm5vLXJldHVybi1hd2FpdFwiOiBcIkB0eXBlc2NyaXB0LWVzbGludC9yZXR1cm4tYXdhaXRcIiwgLy8gbm8tcmV0dXJuLWF3YWl0IGhhcyBiZWVuIGRlcHJlY2F0ZWRcbiAgICB9IGFzIGNvbnN0O1xuXG4gICAgdHlwZSBKczJUc1J1bGVNYXAgPSB0eXBlb2YgZXh0ZW5zaW9uUnVsZU1hcDtcbiAgICB0eXBlIFRzMkpzUnVsZU1hcCA9IHtcbiAgICAgIFtLIGluIGtleW9mIEpzMlRzUnVsZU1hcCBhcyBKczJUc1J1bGVNYXBbS11dOiBLOyAvLyByZXZlcnNlXG4gICAgfTtcblxuICAgIHR5cGUgSnNFeHRlbnNpb25LZXkgPSBFeHRyYWN0PFxuICAgICAga2V5b2YgSnMyVHNSdWxlTWFwLFxuICAgICAga2V5b2YgdHlwZW9mIGpzQmFzZS5ydWxlc1xuICAgID47IC8vIEV4dHJhY3RcbiAgICB0eXBlIFRzRXh0ZW5zaW9uS2V5ID0gSnMyVHNSdWxlTWFwW0pzRXh0ZW5zaW9uS2V5XTtcblxuICAgIHR5cGUgSnNSZXN1bHQgPSBSZWNvcmQ8SnNFeHRlbnNpb25LZXksIFwib2ZmXCI+O1xuICAgIHR5cGUgVHNSZXN1bHQgPSB7XG4gICAgICBbS2V5IGluIFRzRXh0ZW5zaW9uS2V5XTogKHR5cGVvZiBqc0Jhc2UucnVsZXMpW1RzMkpzUnVsZU1hcFtLZXldXTtcbiAgICB9O1xuICAgIHR5cGUgUmVzdWx0ID0gSnNSZXN1bHQgJiBUc1Jlc3VsdDtcblxuICAgIGNvbnN0IGlzSW5FeHRlbnNpb25SdWxlTWFwID0gKFxuICAgICAga2V5OiBzdHJpbmcsXG4gICAgKToga2V5IGlzIGtleW9mIHR5cGVvZiBleHRlbnNpb25SdWxlTWFwID0+IGtleSBpbiBleHRlbnNpb25SdWxlTWFwO1xuICAgIHJldHVybiBPYmplY3QuZW50cmllcyhqc0Jhc2UucnVsZXMpLnJlZHVjZShcbiAgICAgIChyZXN1bHQsIFtqc1J1bGVLZXksIGpzUnVsZVZhbHVlXSkgPT5cbiAgICAgICAgaXNJbkV4dGVuc2lvblJ1bGVNYXAoanNSdWxlS2V5KVxuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAuLi5yZXN1bHQsXG4gICAgICAgICAgICAgIFtqc1J1bGVLZXldOiBcIm9mZlwiLFxuICAgICAgICAgICAgICBbZXh0ZW5zaW9uUnVsZU1hcFtqc1J1bGVLZXldXToganNSdWxlVmFsdWUsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiByZXN1bHQsXG4gICAgICB7fSBhcyBSZXN1bHQsXG4gICAgKTtcbiAgfTtcblxuICByZXR1cm4ge1xuICAgIC4uLmpzQmFzZSxcbiAgICBuYW1lOiBcImZlbmdlL3R5cGVzY3JpcHRcIixcbiAgICBmaWxlczogW1wiKiovKi57dHMsY3RzLG10cyx0c3h9XCJdLFxuICAgIGxhbmd1YWdlT3B0aW9uczoge1xuICAgICAgLi4uanNCYXNlLmxhbmd1YWdlT3B0aW9ucyxcbiAgICAgIHBhcnNlck9wdGlvbnM6IHtcbiAgICAgICAgLi4uanNCYXNlLmxhbmd1YWdlT3B0aW9ucy5wYXJzZXJPcHRpb25zLFxuICAgICAgICAvLyBTZXR0aW5nIGBwcm9qZWN0U2VydmljZTogdHJ1ZWAgb3IgYHByb2plY3Q6IHRydWVgIGlzIHByZXR0eSBzbG93IHdoZW4gbGludCBhIG1vbm9yZXBvIHdpdGggbWFueSB0c2NvbmZpZy5qc29uIGZpbGVzIGluIGVhY2ggc3ViLWFwcC5cbiAgICAgICAgLy8gQnV0IHNldHRpbmcgYHByb2plY3Q6IFwidHNjb25maWcuanNvblwiYCB3aWxsIGNhdXNlIHBhcnNlciBlcnJvciB3aGVuIHRoZSBwcm9qZWN0IHJvb3QgdHNjb25maWcuanNvbiBpcyBgeyBleHRlbmRzOiBcImZlbmdlL3RzY29uZmlnXCIgfWBcbiAgICAgICAgcHJvamVjdFNlcnZpY2U6IHRydWUsXG4gICAgICB9LFxuICAgICAgZ2xvYmFsczoge1xuICAgICAgICAuLi5qc0Jhc2UubGFuZ3VhZ2VPcHRpb25zLmdsb2JhbHMsXG4gICAgICAgIE5vZGVKUzogZmFsc2UsXG4gICAgICB9LFxuICAgIH0sXG4gICAgcGx1Z2luczoge1xuICAgICAgLi4uanNCYXNlLnBsdWdpbnMsXG4gICAgICBcIkBmZW5nZS10c1wiOiBmZW5nZVRzUGx1Z2luLFxuICAgIH0sXG4gICAgcnVsZXM6IHtcbiAgICAgIC4uLmpzQmFzZS5ydWxlcyxcbiAgICAgIC4uLmdldFRzRXh0ZW5zaW9uUnVsZXMoKSxcblxuICAgICAgLy8gZmVuZ2VcbiAgICAgIFwiQGZlbmdlLXRzL2V4YWN0LW1hcC1zZXQtdHlwZVwiOiBcImVycm9yXCIsXG4gICAgICBcIkBmZW5nZS10cy9uby1jb25zdC1lbnVtXCI6IFwiZXJyb3JcIixcbiAgICAgIFwiQGZlbmdlLXRzL25vLWRlY2xhcmVzXCI6IFwiZXJyb3JcIixcbiAgICAgIFwiQGZlbmdlLXRzL25vLWV4cG9ydC1hc3NpZ25tZW50XCI6IFwiZXJyb3JcIixcbiAgICAgIFwiQGZlbmdlLXRzL25vLW1pc3VzZS1zcHJlYWRpbmctcGFyYW1ldGVyXCI6IFwiZXJyb3JcIixcbiAgICAgIFwiQGZlbmdlLXRzL25vLXByb3BlcnR5LWRlY29yYXRvclwiOiBcImVycm9yXCIsXG4gICAgICBcIkBmZW5nZS10cy9uby11bnR5cGVkLWVtcHR5LWFycmF5XCI6IFwiZXJyb3JcIixcbiAgICAgIC8vIHR5cGVzY3JpcHRcbiAgICAgIFwiQHR5cGVzY3JpcHQtZXNsaW50L2FkamFjZW50LW92ZXJsb2FkLXNpZ25hdHVyZXNcIjogXCJlcnJvclwiLFxuICAgICAgLy8gXCJAdHlwZXNjcmlwdC1lc2xpbnQvYXJyYXktdHlwZVwiOiBbXCJlcnJvclwiLCAnYXJyYXktc2ltcGxlJ10sIC8vIFRoZSBkZWZhdWx0IG9wdGlvbiBpcyAnYXJyYXknLiBOb3QgdmVyeSBzdXJlIGlmIHdlIG5lZWQgdG8gY2hhbmdlIHRoZSBvcHRpb24uIFNvIGRpc2FibGVkIGl0LlxuICAgICAgXCJAdHlwZXNjcmlwdC1lc2xpbnQvYXdhaXQtdGhlbmFibGVcIjogXCJlcnJvclwiLFxuICAgICAgXCJAdHlwZXNjcmlwdC1lc2xpbnQvY2xhc3MtbGl0ZXJhbC1wcm9wZXJ0eS1zdHlsZVwiOiBcImVycm9yXCIsXG4gICAgICBcIkB0eXBlc2NyaXB0LWVzbGludC9jb25zaXN0ZW50LWdlbmVyaWMtY29uc3RydWN0b3JzXCI6IFwiZXJyb3JcIixcbiAgICAgIFwiQHR5cGVzY3JpcHQtZXNsaW50L2NvbnNpc3RlbnQtaW5kZXhlZC1vYmplY3Qtc3R5bGVcIjogXCJlcnJvclwiLFxuICAgICAgXCJAdHlwZXNjcmlwdC1lc2xpbnQvY29uc2lzdGVudC10eXBlLWFzc2VydGlvbnNcIjogW1xuICAgICAgICBcImVycm9yXCIsXG4gICAgICAgIHtcbiAgICAgICAgICBhc3NlcnRpb25TdHlsZTogXCJhc1wiLFxuICAgICAgICAgIG9iamVjdExpdGVyYWxUeXBlQXNzZXJ0aW9uczogXCJhbGxvdy1hcy1wYXJhbWV0ZXJcIixcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICBcIkB0eXBlc2NyaXB0LWVzbGludC9jb25zaXN0ZW50LXR5cGUtZGVmaW5pdGlvbnNcIjogW1wiZXJyb3JcIiwgXCJpbnRlcmZhY2VcIl0sIC8vIFRPRE8gc2hvdWxkIHdlIGNoYW5nZSB0byAndHlwZSc/XG4gICAgICBcIkB0eXBlc2NyaXB0LWVzbGludC9jb25zaXN0ZW50LXR5cGUtZXhwb3J0c1wiOiBcImVycm9yXCIsXG4gICAgICBcIkB0eXBlc2NyaXB0LWVzbGludC9jb25zaXN0ZW50LXR5cGUtaW1wb3J0c1wiOiBcImVycm9yXCIsXG4gICAgICBcIkB0eXBlc2NyaXB0LWVzbGludC9kb3Qtbm90YXRpb25cIjogW1wiZXJyb3JcIiwgeyBhbGxvd0tleXdvcmRzOiB0cnVlIH1dLFxuICAgICAgXCJAdHlwZXNjcmlwdC1lc2xpbnQvbWV0aG9kLXNpZ25hdHVyZS1zdHlsZVwiOiBcImVycm9yXCIsXG4gICAgICBcIkB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblwiOiBbXG4gICAgICAgIFwiZXJyb3JcIixcbiAgICAgICAge1xuICAgICAgICAgIHNlbGVjdG9yOiBcImZ1bmN0aW9uXCIsXG4gICAgICAgICAgZm9ybWF0OiBbXCJjYW1lbENhc2VcIiwgXCJQYXNjYWxDYXNlXCJdLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgc2VsZWN0b3I6IFwidmFyaWFibGVcIixcbiAgICAgICAgICB0eXBlczogW1wiZnVuY3Rpb25cIl0sXG4gICAgICAgICAgZm9ybWF0OiBbXCJjYW1lbENhc2VcIiwgXCJQYXNjYWxDYXNlXCJdLCAvLyBkZWNvcmF0b3JzIG5lZWQgUGFzY2FsQ2FzZVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgc2VsZWN0b3I6IFwiY2xhc3NcIixcbiAgICAgICAgICBmb3JtYXQ6IFtcIlBhc2NhbENhc2VcIl0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBzZWxlY3RvcjogXCJpbnRlcmZhY2VcIixcbiAgICAgICAgICBmb3JtYXQ6IFtcIlBhc2NhbENhc2VcIl0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBzZWxlY3RvcjogXCJ0eXBlQWxpYXNcIixcbiAgICAgICAgICBmb3JtYXQ6IFtcIlBhc2NhbENhc2VcIl0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBzZWxlY3RvcjogXCJ0eXBlUGFyYW1ldGVyXCIsXG4gICAgICAgICAgZm9ybWF0OiBbXCJVUFBFUl9DQVNFXCIsIFwiUGFzY2FsQ2FzZVwiXSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICBcIkB0eXBlc2NyaXB0LWVzbGludC9uby1hcnJheS1kZWxldGVcIjogXCJlcnJvclwiLFxuICAgICAgXCJAdHlwZXNjcmlwdC1lc2xpbnQvbm8tYmFzZS10by1zdHJpbmdcIjogW1xuICAgICAgICBcImVycm9yXCIsXG4gICAgICAgIHsgaWdub3JlZFR5cGVOYW1lczogW10gfSxcbiAgICAgIF0sXG4gICAgICBcIkB0eXBlc2NyaXB0LWVzbGludC9uby1jb25mdXNpbmctbm9uLW51bGwtYXNzZXJ0aW9uXCI6IFwiZXJyb3JcIixcbiAgICAgIFwiQHR5cGVzY3JpcHQtZXNsaW50L25vLWNvbmZ1c2luZy12b2lkLWV4cHJlc3Npb25cIjogW1xuICAgICAgICBcImVycm9yXCIsXG4gICAgICAgIHsgaWdub3JlQXJyb3dTaG9ydGhhbmQ6IHRydWUgfSxcbiAgICAgIF0sXG4gICAgICBcIkB0eXBlc2NyaXB0LWVzbGludC9uby1kZXByZWNhdGVkXCI6IFwiZXJyb3JcIixcbiAgICAgIFwiQHR5cGVzY3JpcHQtZXNsaW50L25vLWR1cGxpY2F0ZS1lbnVtLXZhbHVlc1wiOiBcImVycm9yXCIsXG4gICAgICBcIkB0eXBlc2NyaXB0LWVzbGludC9uby1kdXBsaWNhdGUtdHlwZS1jb25zdGl0dWVudHNcIjogXCJlcnJvclwiLFxuICAgICAgXCJAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktb2JqZWN0LXR5cGVcIjogXCJlcnJvclwiLFxuICAgICAgLy8gXCJAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XCI6IFwid2FyblwiLFxuICAgICAgXCJAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXh0cmEtbm9uLW51bGwtYXNzZXJ0aW9uXCI6IFwiZXJyb3JcIixcbiAgICAgIC8vIFwiQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4dHJhbmVvdXMtY2xhc3NcIjogXCJlcnJvclwiLCAvLyBDbGFzc2VzIGhhdmUgb25seSBzdGF0aWMgbWVtYmVyIGlzIHJlYXNvbmFibGUgc29tZXRpbWVzLiBOZXN0anMgbW9kdWxlcyB1c2UgaXQgYSBsb3QuXG4gICAgICBcIkB0eXBlc2NyaXB0LWVzbGludC9uby1mbG9hdGluZy1wcm9taXNlc1wiOiBbXG4gICAgICAgIFwiZXJyb3JcIixcbiAgICAgICAge1xuICAgICAgICAgIGlnbm9yZVZvaWQ6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIFwiQHR5cGVzY3JpcHQtZXNsaW50L25vLWZvci1pbi1hcnJheVwiOiBcImVycm9yXCIsXG4gICAgICBcIkB0eXBlc2NyaXB0LWVzbGludC9uby1pbXBvcnQtdHlwZS1zaWRlLWVmZmVjdHNcIjogXCJlcnJvclwiLFxuICAgICAgXCJAdHlwZXNjcmlwdC1lc2xpbnQvbm8taW5mZXJyYWJsZS10eXBlc1wiOiBcImVycm9yXCIsXG4gICAgICBcIkB0eXBlc2NyaXB0LWVzbGludC9uby1pbnZhbGlkLXZvaWQtdHlwZVwiOiBcImVycm9yXCIsXG4gICAgICBcIkB0eXBlc2NyaXB0LWVzbGludC9uby1taXN1c2VkLW5ld1wiOiBcImVycm9yXCIsXG4gICAgICBcIkB0eXBlc2NyaXB0LWVzbGludC9uby1taXN1c2VkLXByb21pc2VzXCI6IFwiZXJyb3JcIixcbiAgICAgIFwiQHR5cGVzY3JpcHQtZXNsaW50L25vLW1pc3VzZWQtc3ByZWFkXCI6IFwiZXJyb3JcIixcbiAgICAgIFwiQHR5cGVzY3JpcHQtZXNsaW50L25vLW1peGVkLWVudW1zXCI6IFwiZXJyb3JcIixcbiAgICAgIFwiQHR5cGVzY3JpcHQtZXNsaW50L25vLW5hbWVzcGFjZVwiOiBbXG4gICAgICAgIFwiZXJyb3JcIixcbiAgICAgICAgeyBhbGxvd0RlZmluaXRpb25GaWxlczogZmFsc2UgfSxcbiAgICAgIF0sXG4gICAgICBcIkB0eXBlc2NyaXB0LWVzbGludC9uby1ub24tbnVsbC1hc3NlcnRlZC1udWxsaXNoLWNvYWxlc2NpbmdcIjogXCJlcnJvclwiLFxuICAgICAgXCJAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbm9uLW51bGwtYXNzZXJ0ZWQtb3B0aW9uYWwtY2hhaW5cIjogXCJlcnJvclwiLFxuICAgICAgXCJAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbm9uLW51bGwtYXNzZXJ0aW9uXCI6IFwiZXJyb3JcIixcbiAgICAgIFwiQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlZHVuZGFudC10eXBlLWNvbnN0aXR1ZW50c1wiOiBcImVycm9yXCIsXG4gICAgICBcIkB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcIjogXCJlcnJvclwiLFxuICAgICAgXCJAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktYm9vbGVhbi1saXRlcmFsLWNvbXBhcmVcIjogXCJlcnJvclwiLFxuICAgICAgXCJAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uXCI6IFtcbiAgICAgICAgXCJlcnJvclwiLFxuICAgICAgICB7IGFsbG93Q29uc3RhbnRMb29wQ29uZGl0aW9uczogXCJvbmx5LWFsbG93ZWQtbGl0ZXJhbHNcIiB9LFxuICAgICAgXSxcbiAgICAgIFwiQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LXBhcmFtZXRlci1wcm9wZXJ0eS1hc3NpZ25tZW50XCI6XG4gICAgICAgIFwiZXJyb3JcIixcbiAgICAgIFwiQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LXRlbXBsYXRlLWV4cHJlc3Npb25cIjogXCJlcnJvclwiLCAvLyBqcyBhbHNvIG5lZWQgdGhpcyBydWxlXG4gICAgICBcIkB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS10eXBlLWFyZ3VtZW50c1wiOiBcImVycm9yXCIsXG4gICAgICBcIkB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS10eXBlLWFzc2VydGlvblwiOiBcImVycm9yXCIsXG4gICAgICBcIkB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS10eXBlLWNvbnN0cmFpbnRcIjogXCJlcnJvclwiLFxuICAgICAgXCJAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktdHlwZS1jb252ZXJzaW9uXCI6IFwiZXJyb3JcIixcbiAgICAgIFwiQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1jYWxsXCI6IFwiZXJyb3JcIixcbiAgICAgIFwiQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1kZWNsYXJhdGlvbi1tZXJnaW5nXCI6IFwiZXJyb3JcIixcbiAgICAgIFwiQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1lbnVtLWNvbXBhcmlzb25cIjogXCJlcnJvclwiLFxuICAgICAgXCJAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWZ1bmN0aW9uLXR5cGVcIjogXCJlcnJvclwiLFxuICAgICAgXCJAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLXJldHVyblwiOiBcImVycm9yXCIsIC8vIFRoaXMgcnVsZSBpcyBub3QgdmVyeSBwZXJmZWN0LiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3R5cGVzY3JpcHQtZXNsaW50L3R5cGVzY3JpcHQtZXNsaW50L2lzc3Vlcy8xMDQzOVxuICAgICAgXCJAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLXVuYXJ5LW1pbnVzXCI6IFwiZXJyb3JcIixcbiAgICAgIFwiQHR5cGVzY3JpcHQtZXNsaW50L25vLXVzZWxlc3MtZGVmYXVsdC1hc3NpZ25tZW50XCI6IFwiZXJyb3JcIixcbiAgICAgIFwiQHR5cGVzY3JpcHQtZXNsaW50L25vLXdyYXBwZXItb2JqZWN0LXR5cGVzXCI6IFwiZXJyb3JcIixcbiAgICAgIFwiQHR5cGVzY3JpcHQtZXNsaW50L25vbi1udWxsYWJsZS10eXBlLWFzc2VydGlvbi1zdHlsZVwiOiBcImVycm9yXCIsXG4gICAgICBcIkB0eXBlc2NyaXB0LWVzbGludC9vbmx5LXRocm93LWVycm9yXCI6IFtcbiAgICAgICAgXCJlcnJvclwiLFxuICAgICAgICB7IGFsbG93VGhyb3dpbmdVbmtub3duOiBmYWxzZSB9LFxuICAgICAgXSxcbiAgICAgIFwiQHR5cGVzY3JpcHQtZXNsaW50L3ByZWZlci1hcy1jb25zdFwiOiBcImVycm9yXCIsXG4gICAgICBcIkB0eXBlc2NyaXB0LWVzbGludC9wcmVmZXItZnVuY3Rpb24tdHlwZVwiOiBcImVycm9yXCIsXG4gICAgICBcIkB0eXBlc2NyaXB0LWVzbGludC9wcmVmZXItaW5jbHVkZXNcIjogXCJlcnJvclwiLFxuICAgICAgXCJAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLWxpdGVyYWwtZW51bS1tZW1iZXJcIjogXCJlcnJvclwiLFxuICAgICAgXCJAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLW5hbWVzcGFjZS1rZXl3b3JkXCI6IFwiZXJyb3JcIixcbiAgICAgIFwiQHR5cGVzY3JpcHQtZXNsaW50L3ByZWZlci1udWxsaXNoLWNvYWxlc2NpbmdcIjogXCJlcnJvclwiLFxuICAgICAgXCJAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLW9wdGlvbmFsLWNoYWluXCI6IFwiZXJyb3JcIixcbiAgICAgIFwiQHR5cGVzY3JpcHQtZXNsaW50L3ByZWZlci1yZWFkb25seVwiOiBcImVycm9yXCIsXG4gICAgICBcIkB0eXBlc2NyaXB0LWVzbGludC9wcmVmZXItcmVnZXhwLWV4ZWNcIjogXCJlcnJvclwiLFxuICAgICAgXCJAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLXJldHVybi10aGlzLXR5cGVcIjogXCJlcnJvclwiLFxuICAgICAgXCJAdHlwZXNjcmlwdC1lc2xpbnQvcHJvbWlzZS1mdW5jdGlvbi1hc3luY1wiOiBcImVycm9yXCIsXG4gICAgICBcIkB0eXBlc2NyaXB0LWVzbGludC9yZXN0cmljdC1wbHVzLW9wZXJhbmRzXCI6IFtcbiAgICAgICAgXCJlcnJvclwiLFxuICAgICAgICB7XG4gICAgICAgICAgLy8gYWxsb3dBbnk6IGZhbHNlLFxuICAgICAgICAgIGFsbG93Qm9vbGVhbjogZmFsc2UsXG4gICAgICAgICAgYWxsb3dOdWxsaXNoOiBmYWxzZSxcbiAgICAgICAgICBhbGxvd051bWJlckFuZFN0cmluZzogZmFsc2UsXG4gICAgICAgICAgYWxsb3dSZWdFeHA6IGZhbHNlLFxuICAgICAgICAgIHNraXBDb21wb3VuZEFzc2lnbm1lbnRzOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICBcIkB0eXBlc2NyaXB0LWVzbGludC9yZXN0cmljdC10ZW1wbGF0ZS1leHByZXNzaW9uc1wiOiBbXG4gICAgICAgIFwiZXJyb3JcIixcbiAgICAgICAge1xuICAgICAgICAgIGFsbG93OiBbXSxcbiAgICAgICAgICAvLyBhbGxvd0FueTogZmFsc2UsXG4gICAgICAgICAgYWxsb3dCb29sZWFuOiBmYWxzZSxcbiAgICAgICAgICBhbGxvd05ldmVyOiBmYWxzZSxcbiAgICAgICAgICBhbGxvd051bGxpc2g6IGZhbHNlLFxuICAgICAgICAgIC8vIGFsbG93TnVtYmVyOiBmYWxzZSxcbiAgICAgICAgICBhbGxvd1JlZ0V4cDogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgXCJAdHlwZXNjcmlwdC1lc2xpbnQvcmVsYXRlZC1nZXR0ZXItc2V0dGVyLXBhaXJzXCI6IFwiZXJyb3JcIixcbiAgICAgIFwiQHR5cGVzY3JpcHQtZXNsaW50L3JldHVybi1hd2FpdFwiOiBbXCJlcnJvclwiLCBcImFsd2F5c1wiXSxcbiAgICAgIFwiQHR5cGVzY3JpcHQtZXNsaW50L3N3aXRjaC1leGhhdXN0aXZlbmVzcy1jaGVja1wiOiBbXG4gICAgICAgIFwiZXJyb3JcIixcbiAgICAgICAgeyByZXF1aXJlRGVmYXVsdEZvck5vblVuaW9uOiB0cnVlIH0sXG4gICAgICBdLFxuICAgICAgXCJAdHlwZXNjcmlwdC1lc2xpbnQvdW5ib3VuZC1tZXRob2RcIjogXCJlcnJvclwiLFxuICAgICAgXCJAdHlwZXNjcmlwdC1lc2xpbnQvdW5pZmllZC1zaWduYXR1cmVzXCI6IFwiZXJyb3JcIixcbiAgICAgIFwiQHR5cGVzY3JpcHQtZXNsaW50L3VzZS11bmtub3duLWluLWNhdGNoLWNhbGxiYWNrLXZhcmlhYmxlXCI6IFwiZXJyb3JcIixcbiAgICB9LFxuICB9IGFzIGNvbnN0O1xufVxuIl19