@fenge/eslint-config
Version:
A super strict eslint config for linting js/ts/package.json.
470 lines • 63.4 kB
JavaScript
import * as fengePlugin from "@fenge/eslint-plugin";
import tsPlugin from "@typescript-eslint/eslint-plugin";
import tsParser from "@typescript-eslint/parser";
import confusingKeys from "confusing-browser-globals";
import esxPlugin from "eslint-plugin-es-x";
import * as esmPlugin from "eslint-plugin-esm";
import fpPlugin from "eslint-plugin-fp";
import importPlugin from "eslint-plugin-import";
import nPlugin from "eslint-plugin-n";
import promisePlugin from "eslint-plugin-promise";
import reactPlugin from "eslint-plugin-react";
import reactHooksPlugin from "eslint-plugin-react-hooks";
import simpleImportSortPlugin from "eslint-plugin-simple-import-sort";
import sonarjsPlugin from "eslint-plugin-sonarjs";
import unicornPlugin from "eslint-plugin-unicorn";
import globals from "globals";
export function getJsBase() {
// copied from https://github.com/standard/eslint-config-standard/blob/master/src/index.ts
const standardConfigRules = {
"no-var": "error",
"object-shorthand": ["error", "properties"],
"accessor-pairs": [
"error",
{ setWithoutGet: true, enforceForClassMembers: true },
],
"array-callback-return": [
"error",
{
allowImplicit: false,
checkForEach: false,
},
],
camelcase: [
"error",
{
allow: ["^UNSAFE_"],
properties: "never",
ignoreGlobals: true,
},
],
"constructor-super": "error",
"default-case-last": "error",
// 'dot-notation': ['error', { allowKeywords: true }], // TODO: This should be enabled. Disable it as it conflicts with ts when enabling ts-check
eqeqeq: ["error", "always", { null: "ignore" }],
"new-cap": ["error", { newIsCap: true, capIsNew: false, properties: true }],
// 'new-parens': 'error',
"no-array-constructor": "error",
"no-async-promise-executor": "error",
"no-caller": "error",
"no-case-declarations": "error",
"no-class-assign": "error",
"no-compare-neg-zero": "error",
"no-cond-assign": "error",
"no-const-assign": "error",
"no-constant-condition": ["error", { checkLoops: false }],
"no-control-regex": "error",
"no-debugger": "error",
"no-delete-var": "error",
"no-dupe-args": "error",
"no-dupe-class-members": "error",
"no-dupe-keys": "error",
"no-duplicate-case": "error",
"no-useless-backreference": "error",
"no-empty": ["error", { allowEmptyCatch: true }],
"no-empty-character-class": "error",
"no-empty-pattern": "error",
"no-eval": "error",
"no-ex-assign": "error",
"no-extend-native": "error",
"no-extra-bind": "error",
"no-extra-boolean-cast": "error",
"no-fallthrough": "error",
"no-func-assign": "error",
"no-global-assign": "error",
"no-implied-eval": "error",
"no-import-assign": "error",
"no-invalid-regexp": "error",
"no-irregular-whitespace": "error",
"no-iterator": "error",
"no-labels": ["error", { allowLoop: false, allowSwitch: false }],
"no-lone-blocks": "error",
"no-loss-of-precision": "error",
"no-misleading-character-class": "error",
"no-prototype-builtins": "error",
"no-useless-catch": "error",
"no-multi-str": "error",
"no-new": "error",
"no-new-func": "error",
"no-new-wrappers": "error",
"no-obj-calls": "error",
"no-octal": "error",
"no-octal-escape": "error",
"no-promise-executor-return": "error",
"no-proto": "error",
"no-redeclare": ["error", { builtinGlobals: false }],
"no-regex-spaces": "error",
"no-return-assign": ["error", "except-parens"],
"no-script-url": "error",
"no-self-assign": ["error", { props: true }],
"no-self-compare": "error",
"no-sequences": "error",
"no-shadow-restricted-names": "error",
"no-sparse-arrays": "error",
// 'no-template-curly-in-string': 'error', // VSCode an WebStorm can detect it. Enabling this will decrease flexibility. For example, long content containing ${foo} is reasonable.
"no-this-before-super": "error",
"no-throw-literal": "error",
"no-undef": "error",
"no-unmodified-loop-condition": "error",
"no-unneeded-ternary": ["error", { defaultAssignment: false }],
"no-unreachable": "error",
"no-unreachable-loop": "error",
"no-unsafe-finally": "error",
"no-unsafe-negation": "error",
"no-unused-expressions": [
"error",
{
enforceForJSX: true,
allowShortCircuit: true,
allowTernary: true,
allowTaggedTemplates: true,
},
],
"no-unused-vars": [
"error",
{
args: "none",
caughtErrors: "none",
ignoreRestSiblings: true,
vars: "all",
},
],
"no-use-before-define": [
"error",
{ functions: false, classes: false, variables: false },
],
"no-useless-call": "error",
"no-useless-computed-key": "error",
"no-useless-constructor": "error",
"no-useless-escape": "error",
"no-useless-rename": "error",
"no-useless-return": "error",
"no-void": "error",
"no-with": "error",
"one-var": ["error", { initialized: "never" }],
"prefer-const": ["error", { destructuring: "all" }],
"prefer-promise-reject-errors": "error",
"prefer-regex-literals": ["error", { disallowRedundantWrapping: true }],
"symbol-description": "error",
"unicode-bom": ["error", "never"],
"use-isnan": [
"error",
{
enforceForSwitchCase: true,
enforceForIndexOf: true,
},
],
"valid-typeof": ["error", { requireStringLiterals: true }],
yoda: ["error", "never"],
};
return {
name: "fenge/javascript",
files: ["**/*.{js,cjs,mjs,jsx}"],
// https://eslint.org/docs/latest/use/configure/language-options
languageOptions: {
ecmaVersion: "latest",
sourceType: "module",
parser: tsParser, // Unfortunately parser cannot be a string. Eslint should support it. https://eslint.org/docs/latest/use/configure/configuration-files-new#configuring-a-custom-parser-and-its-options
parserOptions: {
// TODO `ecmaVersion` and `sourceType` are no standard here. import/no-default-export required this
ecmaVersion: "latest",
sourceType: "module",
ecmaFeatures: {
jsx: true,
},
},
globals: {
...Object.fromEntries(Object.entries(globals["shared-node-browser"])
.filter(([k]) => !confusingKeys.includes(k))
.filter(([k]) => !["self", "global"].includes(k))),
},
},
plugins: {
fp: fpPlugin,
n: nPlugin,
import: importPlugin,
promise: promisePlugin,
react: reactPlugin,
"react-hooks": reactHooksPlugin,
sonarjs: sonarjsPlugin,
unicorn: unicornPlugin,
"es-x": esxPlugin,
esm: esmPlugin,
"simple-import-sort": simpleImportSortPlugin,
"@fenge": fengePlugin,
"@typescript-eslint": { rules: tsPlugin.rules }, // TODO: Ugly. Submit a pr to typescript-plugin to fix it.
},
rules: {
// 1. standard config rules
...standardConfigRules,
// 2. code style for a better readability
"arrow-body-style": ["error", "as-needed"],
// Sort imports by prettier. Turn in off.
// "simple-import-sort/imports": [
// "error",
// { groups: [["^\\u0000", "^node:", "^@?\\w", "^", "^\\."]] },
// ],
"simple-import-sort/exports": "error",
"unicorn/prefer-node-protocol": "error",
"unicorn/escape-case": "error", // '\ud834' -> '\uD834'
// "unicorn/number-literal-case": "error", // 0XFF -> 0xFF // conflict with prettier
// 3. ban some syntaxes to reduce mistakes
"default-param-last": "error",
"for-direction": "error",
"func-name-matching": "error",
"func-names": "error", // always require a name for function declaration
"func-style": ["error", "declaration", { allowArrowFunctions: true }],
"getter-return": "error",
"init-declarations": "error",
"logical-assignment-operators": [
"error",
"always",
{ enforceForIfStatements: true },
],
"max-depth": ["error", { max: 5 }],
"max-params": ["error", { max: 4 }],
"no-bitwise": "error",
"no-console": "error",
"no-constant-binary-expression": "error",
"no-dupe-else-if": "error",
"no-duplicate-imports": "error",
"no-empty-static-block": "error",
"no-empty-function": "error",
"no-implicit-coercion": [
"error",
{ disallowTemplateShorthand: true, allow: ["!!"] },
], // forbid code like `const num = +str`;
"no-inner-declarations": [
"error",
"functions",
{ blockScopedFunctions: "disallow" },
],
"no-invalid-this": "error",
"no-lonely-if": "error",
"no-multi-assign": "error",
"no-new-native-nonconstructor": "error",
"no-nonoctal-decimal-escape": "error",
"no-object-constructor": "error",
"no-param-reassign": "error",
"no-plusplus": "error",
"no-setter-return": "error",
"no-shadow": ["error", { ignoreOnInitialization: true }],
"no-unsafe-optional-chaining": [
"error",
{ disallowArithmeticOperators: true },
],
"no-unused-labels": "error",
"no-unused-private-class-members": "error",
"require-await": "error",
"require-yield": "error",
"prefer-arrow-callback": "error",
"prefer-exponentiation-operator": "error",
"prefer-object-has-own": "error",
// "prefer-object-spread": "error",
"prefer-spread": "error",
"prefer-template": "error",
// es
"es-x/no-accessor-properties": "error",
"es-x/no-async-iteration": "error",
"es-x/no-generators": "error",
"es-x/no-hashbang": "error",
"es-x/no-legacy-object-prototype-accessor-methods": "error",
"es-x/no-top-level-await": "error",
// esm
"esm/existing-file-imports": "error",
"esm/no-circular-imports": "error",
"esm/no-declaration-file-imports": "error",
"esm/no-directory-imports": "error",
"esm/no-dynamic-imports": "error",
"esm/no-empty-exports": "error",
"esm/no-git-ignored-imports": "error",
"esm/no-phantom-dep-imports": "error",
"esm/no-query-suffixes": "error",
"esm/no-relative-parent-imports": "error",
"esm/no-rename-exports": "error",
"esm/no-rename-imports": "error",
"esm/no-side-effect-imports": "error",
"esm/no-useless-path-segments": "error",
"esm/required-exports": "error",
"esm/top-side-effect-imports": "error",
// fp
"fp/no-arguments": "error",
"fp/no-delete": "error",
// import
"import/export": "error",
"import/first": "error",
// "import/newline-after-import": "error", // already handled by prettier's plugin `@ianvs/prettier-plugin-sort-imports`
"import/no-absolute-path": "error",
"import/no-commonjs": [
"error",
{
allowRequire: false,
allowConditionalRequire: false,
allowPrimitiveModules: false,
},
],
/**
* 1. The ESM specification didn’t say anything about interoperability with CommonJS. See: https://blog.andrewbran.ch/default-exports-in-commonjs-libraries/
* 2. Reexporting like `export * from 'foo'` will be difficult.
*/
"import/no-default-export": "error",
"import/no-duplicates": "error",
"import/no-dynamic-require": "error",
"import/no-empty-named-blocks": "error", // The feature of this rule is already handled by Prettier. But we still put it here.
"import/no-mutable-exports": "error", // forbid code like `export let count = 3`
"import/no-named-default": "error",
"import/no-relative-packages": "error", // forbid to import module from other monorepo packages by relative paths
"import/no-self-import": "error",
"import/no-webpack-loader-syntax": "error",
// n
"n/handle-callback-err": ["error", "^(err|error)$"],
"n/no-callback-literal": "error",
"n/no-deprecated-api": "error",
"n/no-exports-assign": "error",
"n/no-new-require": "error",
"n/no-path-concat": "error",
"n/no-process-exit": "error",
"n/no-unpublished-bin": "error",
"n/prefer-global/buffer": ["error", "never"],
"n/prefer-global/console": "error",
"n/prefer-global/process": ["error", "never"],
"n/prefer-global/text-decoder": "error",
"n/prefer-global/text-encoder": "error",
"n/prefer-global/url": "error",
"n/prefer-global/url-search-params": "error",
"n/process-exit-as-throw": "error",
// promise
"promise/no-return-wrap": "error",
"promise/param-names": "error",
"promise/prefer-catch": "error",
// react
// "react/hook-use-state": "error", // This rule will cause some warnings because we don't specify the version of react.
"react/jsx-filename-extension": [
"error",
{ allow: "as-needed", extensions: [".jsx", ".tsx"] },
],
"react/jsx-key": "error",
"react/jsx-no-duplicate-props": "error",
"react/jsx-no-undef": "error",
"react/jsx-no-useless-fragment": "error",
"react/jsx-props-no-spread-multi": "error",
"react/jsx-uses-vars": "error",
"react/jsx-fragments": "error",
// react-hooks
"react-hooks/exhaustive-deps": "error",
"react-hooks/rules-of-hooks": "error",
// sonarjs
"sonarjs/no-collapsible-if": "error",
"sonarjs/no-all-duplicated-branches": "error",
"sonarjs/no-identical-conditions": "error",
"sonarjs/no-identical-expressions": "error",
"sonarjs/no-ignored-return": "error",
"sonarjs/no-inverted-boolean-check": "error",
"sonarjs/no-nested-switch": "error",
"sonarjs/no-useless-catch": "error",
"sonarjs/prefer-immediate-return": "error",
// unicorn
// 'unicorn/no-null': 'error', // null can be useful when interact with json.
"unicorn/catch-error-name": ["error", { ignore: ["^e$", "^err$"] }],
"unicorn/consistent-assert": "error",
"unicorn/consistent-date-clone": "error",
"unicorn/consistent-destructuring": "error",
"unicorn/consistent-empty-array-spread": "error",
"unicorn/error-message": "error",
"unicorn/explicit-length-check": "error",
"unicorn/filename-case": [
"error",
{ cases: { kebabCase: true, pascalCase: true } },
],
"unicorn/import-style": [
"error",
{
styles: {
react: { named: true },
child_process: { default: true },
fs: { default: true },
"fs/promises": { default: true },
process: { default: true },
"util/types": { named: true },
"node:child_process": { default: true },
"node:fs": { default: true },
"node:fs/promises": { default: true },
"node:process": { default: true },
"node:util/types": { named: true },
},
},
],
"unicorn/new-for-builtins": "error",
"unicorn/no-abusive-eslint-disable": "error",
"unicorn/no-accessor-recursion": "error",
"unicorn/no-array-callback-reference": "error",
"unicorn/no-array-method-this-argument": "error",
"unicorn/no-await-in-promise-methods": "error",
"unicorn/no-for-loop": "error",
"unicorn/no-instanceof-builtins": "error",
"unicorn/no-lonely-if": "error",
"unicorn/no-named-default": "error",
"unicorn/no-negation-in-equality-check": "error",
"unicorn/no-new-array": "error",
"unicorn/no-new-buffer": "error",
"unicorn/no-process-exit": "error", // Prefer `n/no-process-exit`, but at the same time using this rule seems have no problem
"unicorn/no-single-promise-in-promise-methods": "error",
"unicorn/no-static-only-class": "error",
"unicorn/no-thenable": "error",
"unicorn/no-this-assignment": "error",
"unicorn/no-typeof-undefined": "error",
"unicorn/no-unnecessary-array-flat-depth": "error",
"unicorn/no-unnecessary-await": "error",
"unicorn/no-unreadable-array-destructuring": "error",
"unicorn/no-unreadable-iife": "error",
"unicorn/no-useless-fallback-in-spread": "error",
"unicorn/no-useless-promise-resolve-reject": "error",
"unicorn/no-useless-spread": "error",
"unicorn/no-useless-switch-case": "error",
"unicorn/no-zero-fractions": "error",
"unicorn/prefer-array-flat-map": "error",
"unicorn/prefer-date-now": "error",
"unicorn/prefer-export-from": "error",
"unicorn/prefer-global-this": "error",
"unicorn/prefer-includes": "error",
"unicorn/prefer-logical-operator-over-ternary": "error",
"unicorn/prefer-math-min-max": "error",
"unicorn/prefer-module": "error",
"unicorn/prefer-negative-index": "error",
"unicorn/prefer-number-properties": "error",
"unicorn/prefer-object-from-entries": "error",
"unicorn/prefer-optional-catch-binding": "error",
"unicorn/prefer-prototype-methods": "error",
"unicorn/prefer-reflect-apply": "error", // https://github.com/sindresorhus/eslint-plugin-unicorn/issues/2365
"unicorn/prefer-regexp-test": "error",
"unicorn/prefer-string-replace-all": "error",
"unicorn/prefer-string-slice": "error",
"unicorn/prefer-ternary": "error",
// "unicorn/prefer-type-error": "error",
"unicorn/require-array-join-separator": "error",
"unicorn/require-number-to-fixed-digits-argument": "error",
"unicorn/text-encoding-identifier-case": "error",
"unicorn/throw-new-error": "error",
"@fenge/call-arguments-length": "error",
"@fenge/no-instanceof-builtin": "error",
"@fenge/no-nested-class": "error",
"@fenge/no-nested-function": "error",
"@fenge/no-restricted-loops": "error",
"@fenge/no-top-level-arrow-function": "error",
"@fenge/no-triple-slash-directive": "error",
"@fenge/no-unnecessary-template-string": "error",
"@typescript-eslint/ban-ts-comment": [
"error",
{
"ts-expect-error": true,
"ts-ignore": true,
"ts-nocheck": true,
},
],
"@typescript-eslint/no-this-alias": "error",
"@typescript-eslint/no-useless-empty-export": "error",
"@typescript-eslint/prefer-for-of": "error",
},
};
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb25maWcvanMvYmFzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssV0FBVyxNQUFNLHNCQUFzQixDQUFDO0FBQ3BELE9BQU8sUUFBUSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3hELE9BQU8sUUFBUSxNQUFNLDJCQUEyQixDQUFDO0FBQ2pELE9BQU8sYUFBYSxNQUFNLDJCQUEyQixDQUFDO0FBQ3RELE9BQU8sU0FBUyxNQUFNLG9CQUFvQixDQUFDO0FBQzNDLE9BQU8sS0FBSyxTQUFTLE1BQU0sbUJBQW1CLENBQUM7QUFDL0MsT0FBTyxRQUFRLE1BQU0sa0JBQWtCLENBQUM7QUFDeEMsT0FBTyxZQUFZLE1BQU0sc0JBQXNCLENBQUM7QUFDaEQsT0FBTyxPQUFPLE1BQU0saUJBQWlCLENBQUM7QUFDdEMsT0FBTyxhQUFhLE1BQU0sdUJBQXVCLENBQUM7QUFDbEQsT0FBTyxXQUFXLE1BQU0scUJBQXFCLENBQUM7QUFDOUMsT0FBTyxnQkFBZ0IsTUFBTSwyQkFBMkIsQ0FBQztBQUN6RCxPQUFPLHNCQUFzQixNQUFNLGtDQUFrQyxDQUFDO0FBQ3RFLE9BQU8sYUFBYSxNQUFNLHVCQUF1QixDQUFDO0FBQ2xELE9BQU8sYUFBYSxNQUFNLHVCQUF1QixDQUFDO0FBQ2xELE9BQU8sT0FBTyxNQUFNLFNBQVMsQ0FBQztBQUU5QixNQUFNLFVBQVUsU0FBUztJQUN2QiwwRkFBMEY7SUFDMUYsTUFBTSxtQkFBbUIsR0FBRztRQUMxQixRQUFRLEVBQUUsT0FBTztRQUNqQixrQkFBa0IsRUFBRSxDQUFDLE9BQU8sRUFBRSxZQUFZLENBQUM7UUFFM0MsZ0JBQWdCLEVBQUU7WUFDaEIsT0FBTztZQUNQLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxzQkFBc0IsRUFBRSxJQUFJLEVBQUU7U0FDdEQ7UUFDRCx1QkFBdUIsRUFBRTtZQUN2QixPQUFPO1lBQ1A7Z0JBQ0Us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RCx5QkFBeUIsRUFBRSxPQUFPO1lBRWxDLDhCQUE4QixFQUFFLE9BQU87WUFDdkMsOEJBQThCLEVBQUUsT0FBTztZQUN2Qyx3QkFBd0IsRUFBRSxPQUFPO1lBQ2pDLDJCQUEyQixFQUFFLE9BQU87WUFDcEMsNEJBQTRCLEVBQUUsT0FBTztZQUNyQyxvQ0FBb0MsRUFBRSxPQUFPO1lBQzdDLGtDQUFrQyxFQUFFLE9BQU87WUFDM0MsdUNBQXVDLEVBQUUsT0FBTztZQUVoRCxtQ0FBbUMsRUFBRTtnQkFDbkMsT0FBTztnQkFDUDtvQkFDRSxpQkFBaUIsRUFBRSxJQUFJO29CQUN2QixXQUFXLEVBQUUsSUFBSTtvQkFDakIsWUFBWSxFQUFFLElBQUk7aUJBQ25CO2FBQ0Y7WUFDRCxrQ0FBa0MsRUFBRSxPQUFPO1lBQzNDLDRDQUE0QyxFQUFFLE9BQU87WUFDckQsa0NBQWtDLEVBQUUsT0FBTztTQUM1QztLQUNPLENBQUM7QUFDYixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgZmVuZ2VQbHVnaW4gZnJvbSBcIkBmZW5nZS9lc2xpbnQtcGx1Z2luXCI7XG5pbXBvcnQgdHNQbHVnaW4gZnJvbSBcIkB0eXBlc2NyaXB0LWVzbGludC9lc2xpbnQtcGx1Z2luXCI7XG5pbXBvcnQgdHNQYXJzZXIgZnJvbSBcIkB0eXBlc2NyaXB0LWVzbGludC9wYXJzZXJcIjtcbmltcG9ydCBjb25mdXNpbmdLZXlzIGZyb20gXCJjb25mdXNpbmctYnJvd3Nlci1nbG9iYWxzXCI7XG5pbXBvcnQgZXN4UGx1Z2luIGZyb20gXCJlc2xpbnQtcGx1Z2luLWVzLXhcIjtcbmltcG9ydCAqIGFzIGVzbVBsdWdpbiBmcm9tIFwiZXNsaW50LXBsdWdpbi1lc21cIjtcbmltcG9ydCBmcFBsdWdpbiBmcm9tIFwiZXNsaW50LXBsdWdpbi1mcFwiO1xuaW1wb3J0IGltcG9ydFBsdWdpbiBmcm9tIFwiZXNsaW50LXBsdWdpbi1pbXBvcnRcIjtcbmltcG9ydCBuUGx1Z2luIGZyb20gXCJlc2xpbnQtcGx1Z2luLW5cIjtcbmltcG9ydCBwcm9taXNlUGx1Z2luIGZyb20gXCJlc2xpbnQtcGx1Z2luLXByb21pc2VcIjtcbmltcG9ydCByZWFjdFBsdWdpbiBmcm9tIFwiZXNsaW50LXBsdWdpbi1yZWFjdFwiO1xuaW1wb3J0IHJlYWN0SG9va3NQbHVnaW4gZnJvbSBcImVzbGludC1wbHVnaW4tcmVhY3QtaG9va3NcIjtcbmltcG9ydCBzaW1wbGVJbXBvcnRTb3J0UGx1Z2luIGZyb20gXCJlc2xpbnQtcGx1Z2luLXNpbXBsZS1pbXBvcnQtc29ydFwiO1xuaW1wb3J0IHNvbmFyanNQbHVnaW4gZnJvbSBcImVzbGludC1wbHVnaW4tc29uYXJqc1wiO1xuaW1wb3J0IHVuaWNvcm5QbHVnaW4gZnJvbSBcImVzbGludC1wbHVnaW4tdW5pY29yblwiO1xuaW1wb3J0IGdsb2JhbHMgZnJvbSBcImdsb2JhbHNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldEpzQmFzZSgpIHtcbiAgLy8gY29waWVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL3N0YW5kYXJkL2VzbGludC1jb25maWctc3RhbmRhcmQvYmxvYi9tYXN0ZXIvc3JjL2luZGV4LnRzXG4gIGNvbnN0IHN0YW5kYXJkQ29uZmlnUnVsZXMgPSB7XG4gICAgXCJuby12YXJcIjogXCJlcnJvclwiLFxuICAgIFwib2JqZWN0LXNob3J0aGFuZFwiOiBbXCJlcnJvclwiLCBcInByb3BlcnRpZXNcIl0sXG5cbiAgICBcImFjY2Vzc29yLXBhaXJzXCI6IFtcbiAgICAgIFwiZXJyb3JcIixcbiAgICAgIHsgc2V0V2l0aG91dEdldDogdHJ1ZSwgZW5mb3JjZUZvckNsYXNzTWVtYmVyczogdHJ1ZSB9LFxuICAgIF0sXG4gICAgXCJhcnJheS1jYWxsYmFjay1yZXR1cm5cIjogW1xuICAgICAgXCJlcnJvclwiLFxuICAgICAge1xuICAgICAgICBhbGxvd0ltcGxpY2l0OiBmYWxzZSxcbiAgICAgICAgY2hlY2tGb3JFYWNoOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgXSxcbiAgICBjYW1lbGNhc2U6IFtcbiAgICAgIFwiZXJyb3JcIixcbiAgICAgIHtcbiAgICAgICAgYWxsb3c6IFtcIl5VTlNBRkVfXCJdLFxuICAgICAgICBwcm9wZXJ0aWVzOiBcIm5ldmVyXCIsXG4gICAgICAgIGlnbm9yZUdsb2JhbHM6IHRydWUsXG4gICAgICB9LFxuICAgIF0sXG4gICAgXCJjb25zdHJ1Y3Rvci1zdXBlclwiOiBcImVycm9yXCIsXG4gICAgXCJkZWZhdWx0LWNhc2UtbGFzdFwiOiBcImVycm9yXCIsXG4gICAgLy8gJ2RvdC1ub3RhdGlvbic6IFsnZXJyb3InLCB7IGFsbG93S2V5d29yZHM6IHRydWUgfV0sIC8vIFRPRE86IFRoaXMgc2hvdWxkIGJlIGVuYWJsZWQuIERpc2FibGUgaXQgYXMgaXQgY29uZmxpY3RzIHdpdGggdHMgd2hlbiBlbmFibGluZyB0cy1jaGVja1xuICAgIGVxZXFlcTogW1wiZXJyb3JcIiwgXCJhbHdheXNcIiwgeyBudWxsOiBcImlnbm9yZVwiIH1dLFxuICAgIFwibmV3LWNhcFwiOiBbXCJlcnJvclwiLCB7IG5ld0lzQ2FwOiB0cnVlLCBjYXBJc05ldzogZmFsc2UsIHByb3BlcnRpZXM6IHRydWUgfV0sXG4gICAgLy8gJ25ldy1wYXJlbnMnOiAnZXJyb3InLFxuICAgIFwibm8tYXJyYXktY29uc3RydWN0b3JcIjogXCJlcnJvclwiLFxuICAgIFwibm8tYXN5bmMtcHJvbWlzZS1leGVjdXRvclwiOiBcImVycm9yXCIsXG4gICAgXCJuby1jYWxsZXJcIjogXCJlcnJvclwiLFxuICAgIFwibm8tY2FzZS1kZWNsYXJhdGlvbnNcIjogXCJlcnJvclwiLFxuICAgIFwibm8tY2xhc3MtYXNzaWduXCI6IFwiZXJyb3JcIixcbiAgICBcIm5vLWNvbXBhcmUtbmVnLXplcm9cIjogXCJlcnJvclwiLFxuICAgIFwibm8tY29uZC1hc3NpZ25cIjogXCJlcnJvclwiLFxuICAgIFwibm8tY29uc3QtYXNzaWduXCI6IFwiZXJyb3JcIixcbiAgICBcIm5vLWNvbnN0YW50LWNvbmRpdGlvblwiOiBbXCJlcnJvclwiLCB7IGNoZWNrTG9vcHM6IGZhbHNlIH1dLFxuICAgIFwibm8tY29udHJvbC1yZWdleFwiOiBcImVycm9yXCIsXG4gICAgXCJuby1kZWJ1Z2dlclwiOiBcImVycm9yXCIsXG4gICAgXCJuby1kZWxldGUtdmFyXCI6IFwiZXJyb3JcIixcbiAgICBcIm5vLWR1cGUtYXJnc1wiOiBcImVycm9yXCIsXG4gICAgXCJuby1kdXBlLWNsYXNzLW1lbWJlcnNcIjogXCJlcnJvclwiLFxuICAgIFwibm8tZHVwZS1rZXlzXCI6IFwiZXJyb3JcIixcbiAgICBcIm5vLWR1cGxpY2F0ZS1jYXNlXCI6IFwiZXJyb3JcIixcbiAgICBcIm5vLXVzZWxlc3MtYmFja3JlZmVyZW5jZVwiOiBcImVycm9yXCIsXG4gICAgXCJuby1lbXB0eVwiOiBbXCJlcnJvclwiLCB7IGFsbG93RW1wdHlDYXRjaDogdHJ1ZSB9XSxcbiAgICBcIm5vLWVtcHR5LWNoYXJhY3Rlci1jbGFzc1wiOiBcImVycm9yXCIsXG4gICAgXCJuby1lbXB0eS1wYXR0ZXJuXCI6IFwiZXJyb3JcIixcbiAgICBcIm5vLWV2YWxcIjogXCJlcnJvclwiLFxuICAgIFwibm8tZXgtYXNzaWduXCI6IFwiZXJyb3JcIixcbiAgICBcIm5vLWV4dGVuZC1uYXRpdmVcIjogXCJlcnJvclwiLFxuICAgIFwibm8tZXh0cmEtYmluZFwiOiBcImVycm9yXCIsXG4gICAgXCJuby1leHRyYS1ib29sZWFuLWNhc3RcIjogXCJlcnJvclwiLFxuICAgIFwibm8tZmFsbHRocm91Z2hcIjogXCJlcnJvclwiLFxuICAgIFwibm8tZnVuYy1hc3NpZ25cIjogXCJlcnJvclwiLFxuICAgIFwibm8tZ2xvYmFsLWFzc2lnblwiOiBcImVycm9yXCIsXG4gICAgXCJuby1pbXBsaWVkLWV2YWxcIjogXCJlcnJvclwiLFxuICAgIFwibm8taW1wb3J0LWFzc2lnblwiOiBcImVycm9yXCIsXG4gICAgXCJuby1pbnZhbGlkLXJlZ2V4cFwiOiBcImVycm9yXCIsXG4gICAgXCJuby1pcnJlZ3VsYXItd2hpdGVzcGFjZVwiOiBcImVycm9yXCIsXG4gICAgXCJuby1pdGVyYXRvclwiOiBcImVycm9yXCIsXG4gICAgXCJuby1sYWJlbHNcIjogW1wiZXJyb3JcIiwgeyBhbGxvd0xvb3A6IGZhbHNlLCBhbGxvd1N3aXRjaDogZmFsc2UgfV0sXG4gICAgXCJuby1sb25lLWJsb2Nrc1wiOiBcImVycm9yXCIsXG4gICAgXCJuby1sb3NzLW9mLXByZWNpc2lvblwiOiBcImVycm9yXCIsXG4gICAgXCJuby1taXNsZWFkaW5nLWNoYXJhY3Rlci1jbGFzc1wiOiBcImVycm9yXCIsXG4gICAgXCJuby1wcm90b3R5cGUtYnVpbHRpbnNcIjogXCJlcnJvclwiLFxuICAgIFwibm8tdXNlbGVzcy1jYXRjaFwiOiBcImVycm9yXCIsXG4gICAgXCJuby1tdWx0aS1zdHJcIjogXCJlcnJvclwiLFxuICAgIFwibm8tbmV3XCI6IFwiZXJyb3JcIixcbiAgICBcIm5vLW5ldy1mdW5jXCI6IFwiZXJyb3JcIixcbiAgICBcIm5vLW5ldy13cmFwcGVyc1wiOiBcImVycm9yXCIsXG4gICAgXCJuby1vYmotY2FsbHNcIjogXCJlcnJvclwiLFxuICAgIFwibm8tb2N0YWxcIjogXCJlcnJvclwiLFxuICAgIFwibm8tb2N0YWwtZXNjYXBlXCI6IFwiZXJyb3JcIixcbiAgICBcIm5vLXByb21pc2UtZXhlY3V0b3ItcmV0dXJuXCI6IFwiZXJyb3JcIixcbiAgICBcIm5vLXByb3RvXCI6IFwiZXJyb3JcIixcbiAgICBcIm5vLXJlZGVjbGFyZVwiOiBbXCJlcnJvclwiLCB7IGJ1aWx0aW5HbG9iYWxzOiBmYWxzZSB9XSxcbiAgICBcIm5vLXJlZ2V4LXNwYWNlc1wiOiBcImVycm9yXCIsXG4gICAgXCJuby1yZXR1cm4tYXNzaWduXCI6IFtcImVycm9yXCIsIFwiZXhjZXB0LXBhcmVuc1wiXSxcbiAgICBcIm5vLXNjcmlwdC11cmxcIjogXCJlcnJvclwiLFxuICAgIFwibm8tc2VsZi1hc3NpZ25cIjogW1wiZXJyb3JcIiwgeyBwcm9wczogdHJ1ZSB9XSxcbiAgICBcIm5vLXNlbGYtY29tcGFyZVwiOiBcImVycm9yXCIsXG4gICAgXCJuby1zZXF1ZW5jZXNcIjogXCJlcnJvclwiLFxuICAgIFwibm8tc2hhZG93LXJlc3RyaWN0ZWQtbmFtZXNcIjogXCJlcnJvclwiLFxuICAgIFwibm8tc3BhcnNlLWFycmF5c1wiOiBcImVycm9yXCIsXG4gICAgLy8gJ25vLXRlbXBsYXRlLWN1cmx5LWluLXN0cmluZyc6ICdlcnJvcicsIC8vIFZTQ29kZSBhbiBXZWJTdG9ybSBjYW4gZGV0ZWN0IGl0LiBFbmFibGluZyB0aGlzIHdpbGwgZGVjcmVhc2UgZmxleGliaWxpdHkuIEZvciBleGFtcGxlLCBsb25nIGNvbnRlbnQgY29udGFpbmluZyAke2Zvb30gaXMgcmVhc29uYWJsZS5cbiAgICBcIm5vLXRoaXMtYmVmb3JlLXN1cGVyXCI6IFwiZXJyb3JcIixcbiAgICBcIm5vLXRocm93LWxpdGVyYWxcIjogXCJlcnJvclwiLFxuICAgIFwibm8tdW5kZWZcIjogXCJlcnJvclwiLFxuICAgIFwibm8tdW5tb2RpZmllZC1sb29wLWNvbmRpdGlvblwiOiBcImVycm9yXCIsXG4gICAgXCJuby11bm5lZWRlZC10ZXJuYXJ5XCI6IFtcImVycm9yXCIsIHsgZGVmYXVsdEFzc2lnbm1lbnQ6IGZhbHNlIH1dLFxuICAgIFwibm8tdW5yZWFjaGFibGVcIjogXCJlcnJvclwiLFxuICAgIFwibm8tdW5yZWFjaGFibGUtbG9vcFwiOiBcImVycm9yXCIsXG4gICAgXCJuby11bnNhZmUtZmluYWxseVwiOiBcImVycm9yXCIsXG4gICAgXCJuby11bnNhZmUtbmVnYXRpb25cIjogXCJlcnJvclwiLFxuICAgIFwibm8tdW51c2VkLWV4cHJlc3Npb25zXCI6IFtcbiAgICAgIFwiZXJyb3JcIixcbiAgICAgIHtcbiAgICAgICAgZW5mb3JjZUZvckpTWDogdHJ1ZSxcbiAgICAgICAgYWxsb3dTaG9ydENpcmN1aXQ6IHRydWUsXG4gICAgICAgIGFsbG93VGVybmFyeTogdHJ1ZSxcbiAgICAgICAgYWxsb3dUYWdnZWRUZW1wbGF0ZXM6IHRydWUsXG4gICAgICB9LFxuICAgIF0sXG4gICAgXCJuby11bnVzZWQtdmFyc1wiOiBbXG4gICAgICBcImVycm9yXCIsXG4gICAgICB7XG4gICAgICAgIGFyZ3M6IFwibm9uZVwiLFxuICAgICAgICBjYXVnaHRFcnJvcnM6IFwibm9uZVwiLFxuICAgICAgICBpZ25vcmVSZXN0U2libGluZ3M6IHRydWUsXG4gICAgICAgIHZhcnM6IFwiYWxsXCIsXG4gICAgICB9LFxuICAgIF0sXG4gICAgXCJuby11c2UtYmVmb3JlLWRlZmluZVwiOiBbXG4gICAgICBcImVycm9yXCIsXG4gICAgICB7IGZ1bmN0aW9uczogZmFsc2UsIGNsYXNzZXM6IGZhbHNlLCB2YXJpYWJsZXM6IGZhbHNlIH0sXG4gICAgXSxcbiAgICBcIm5vLXVzZWxlc3MtY2FsbFwiOiBcImVycm9yXCIsXG4gICAgXCJuby11c2VsZXNzLWNvbXB1dGVkLWtleVwiOiBcImVycm9yXCIsXG4gICAgXCJuby11c2VsZXNzLWNvbnN0cnVjdG9yXCI6IFwiZXJyb3JcIixcbiAgICBcIm5vLXVzZWxlc3MtZXNjYXBlXCI6IFwiZXJyb3JcIixcbiAgICBcIm5vLXVzZWxlc3MtcmVuYW1lXCI6IFwiZXJyb3JcIixcbiAgICBcIm5vLXVzZWxlc3MtcmV0dXJuXCI6IFwiZXJyb3JcIixcbiAgICBcIm5vLXZvaWRcIjogXCJlcnJvclwiLFxuICAgIFwibm8td2l0aFwiOiBcImVycm9yXCIsXG4gICAgXCJvbmUtdmFyXCI6IFtcImVycm9yXCIsIHsgaW5pdGlhbGl6ZWQ6IFwibmV2ZXJcIiB9XSxcbiAgICBcInByZWZlci1jb25zdFwiOiBbXCJlcnJvclwiLCB7IGRlc3RydWN0dXJpbmc6IFwiYWxsXCIgfV0sXG4gICAgXCJwcmVmZXItcHJvbWlzZS1yZWplY3QtZXJyb3JzXCI6IFwiZXJyb3JcIixcbiAgICBcInByZWZlci1yZWdleC1saXRlcmFsc1wiOiBbXCJlcnJvclwiLCB7IGRpc2FsbG93UmVkdW5kYW50V3JhcHBpbmc6IHRydWUgfV0sXG4gICAgXCJzeW1ib2wtZGVzY3JpcHRpb25cIjogXCJlcnJvclwiLFxuICAgIFwidW5pY29kZS1ib21cIjogW1wiZXJyb3JcIiwgXCJuZXZlclwiXSxcbiAgICBcInVzZS1pc25hblwiOiBbXG4gICAgICBcImVycm9yXCIsXG4gICAgICB7XG4gICAgICAgIGVuZm9yY2VGb3JTd2l0Y2hDYXNlOiB0cnVlLFxuICAgICAgICBlbmZvcmNlRm9ySW5kZXhPZjogdHJ1ZSxcbiAgICAgIH0sXG4gICAgXSxcbiAgICBcInZhbGlkLXR5cGVvZlwiOiBbXCJlcnJvclwiLCB7IHJlcXVpcmVTdHJpbmdMaXRlcmFsczogdHJ1ZSB9XSxcbiAgICB5b2RhOiBbXCJlcnJvclwiLCBcIm5ldmVyXCJdLFxuICB9IGFzIGNvbnN0O1xuXG4gIHJldHVybiB7XG4gICAgbmFtZTogXCJmZW5nZS9qYXZhc2NyaXB0XCIsXG4gICAgZmlsZXM6IFtcIioqLyoue2pzLGNqcyxtanMsanN4fVwiXSxcbiAgICAvLyBodHRwczovL2VzbGludC5vcmcvZG9jcy9sYXRlc3QvdXNlL2NvbmZpZ3VyZS9sYW5ndWFnZS1vcHRpb25zXG4gICAgbGFuZ3VhZ2VPcHRpb25zOiB7XG4gICAgICBlY21hVmVyc2lvbjogXCJsYXRlc3RcIixcbiAgICAgIHNvdXJjZVR5cGU6IFwibW9kdWxlXCIsXG4gICAgICBwYXJzZXI6IHRzUGFyc2VyLCAvLyBVbmZvcnR1bmF0ZWx5IHBhcnNlciBjYW5ub3QgYmUgYSBzdHJpbmcuIEVzbGludCBzaG91bGQgc3VwcG9ydCBpdC4gaHR0cHM6Ly9lc2xpbnQub3JnL2RvY3MvbGF0ZXN0L3VzZS9jb25maWd1cmUvY29uZmlndXJhdGlvbi1maWxlcy1uZXcjY29uZmlndXJpbmctYS1jdXN0b20tcGFyc2VyLWFuZC1pdHMtb3B0aW9uc1xuICAgICAgcGFyc2VyT3B0aW9uczoge1xuICAgICAgICAvLyBUT0RPIGBlY21hVmVyc2lvbmAgYW5kIGBzb3VyY2VUeXBlYCBhcmUgbm8gc3RhbmRhcmQgaGVyZS4gaW1wb3J0L25vLWRlZmF1bHQtZXhwb3J0IHJlcXVpcmVkIHRoaXNcbiAgICAgICAgZWNtYVZlcnNpb246IFwibGF0ZXN0XCIsXG4gICAgICAgIHNvdXJjZVR5cGU6IFwibW9kdWxlXCIsXG4gICAgICAgIGVjbWFGZWF0dXJlczoge1xuICAgICAgICAgIGpzeDogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBnbG9iYWxzOiB7XG4gICAgICAgIC4uLk9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgICBPYmplY3QuZW50cmllcyhnbG9iYWxzW1wic2hhcmVkLW5vZGUtYnJvd3NlclwiXSlcbiAgICAgICAgICAgIC5maWx0ZXIoKFtrXSkgPT4gIWNvbmZ1c2luZ0tleXMuaW5jbHVkZXMoaykpXG4gICAgICAgICAgICAuZmlsdGVyKChba10pID0+ICFbXCJzZWxmXCIsIFwiZ2xvYmFsXCJdLmluY2x1ZGVzKGspKSwgLy8gcHJlZmVyIGBnbG9iYWxUaGlzYFxuICAgICAgICApLFxuICAgICAgfSxcbiAgICB9LFxuICAgIHBsdWdpbnM6IHtcbiAgICAgIGZwOiBmcFBsdWdpbixcbiAgICAgIG46IG5QbHVnaW4sXG4gICAgICBpbXBvcnQ6IGltcG9ydFBsdWdpbixcbiAgICAgIHByb21pc2U6IHByb21pc2VQbHVnaW4sXG4gICAgICByZWFjdDogcmVhY3RQbHVnaW4sXG4gICAgICBcInJlYWN0LWhvb2tzXCI6IHJlYWN0SG9va3NQbHVnaW4sXG4gICAgICBzb25hcmpzOiBzb25hcmpzUGx1Z2luLFxuICAgICAgdW5pY29ybjogdW5pY29yblBsdWdpbixcbiAgICAgIFwiZXMteFwiOiBlc3hQbHVnaW4sXG4gICAgICBlc206IGVzbVBsdWdpbixcbiAgICAgIFwic2ltcGxlLWltcG9ydC1zb3J0XCI6IHNpbXBsZUltcG9ydFNvcnRQbHVnaW4sXG4gICAgICBcIkBmZW5nZVwiOiBmZW5nZVBsdWdpbixcbiAgICAgIFwiQHR5cGVzY3JpcHQtZXNsaW50XCI6IHsgcnVsZXM6IHRzUGx1Z2luLnJ1bGVzIH0sIC8vIFRPRE86IFVnbHkuIFN1Ym1pdCBhIHByIHRvIHR5cGVzY3JpcHQtcGx1Z2luIHRvIGZpeCBpdC5cbiAgICB9LFxuICAgIHJ1bGVzOiB7XG4gICAgICAvLyAxLiBzdGFuZGFyZCBjb25maWcgcnVsZXNcbiAgICAgIC4uLnN0YW5kYXJkQ29uZmlnUnVsZXMsXG5cbiAgICAgIC8vIDIuIGNvZGUgc3R5bGUgZm9yIGEgYmV0dGVyIHJlYWRhYmlsaXR5XG4gICAgICBcImFycm93LWJvZHktc3R5bGVcIjogW1wiZXJyb3JcIiwgXCJhcy1uZWVkZWRcIl0sXG4gICAgICAvLyBTb3J0IGltcG9ydHMgYnkgcHJldHRpZXIuIFR1cm4gaW4gb2ZmLlxuICAgICAgLy8gXCJzaW1wbGUtaW1wb3J0LXNvcnQvaW1wb3J0c1wiOiBbXG4gICAgICAvLyAgIFwiZXJyb3JcIixcbiAgICAgIC8vICAgeyBncm91cHM6IFtbXCJeXFxcXHUwMDAwXCIsIFwiXm5vZGU6XCIsIFwiXkA/XFxcXHdcIiwgXCJeXCIsIFwiXlxcXFwuXCJdXSB9LFxuICAgICAgLy8gXSxcbiAgICAgIFwic2ltcGxlLWltcG9ydC1zb3J0L2V4cG9ydHNcIjogXCJlcnJvclwiLFxuICAgICAgXCJ1bmljb3JuL3ByZWZlci1ub2RlLXByb3RvY29sXCI6IFwiZXJyb3JcIixcbiAgICAgIFwidW5pY29ybi9lc2NhcGUtY2FzZVwiOiBcImVycm9yXCIsIC8vICdcXHVkODM0JyAtPiAnXFx1RDgzNCdcbiAgICAgIC8vIFwidW5pY29ybi9udW1iZXItbGl0ZXJhbC1jYXNlXCI6IFwiZXJyb3JcIiwgLy8gMFhGRiAtPiAweEZGIC8vIGNvbmZsaWN0IHdpdGggcHJldHRpZXJcblxuICAgICAgLy8gMy4gYmFuIHNvbWUgc3ludGF4ZXMgdG8gcmVkdWNlIG1pc3Rha2VzXG4gICAgICBcImRlZmF1bHQtcGFyYW0tbGFzdFwiOiBcImVycm9yXCIsXG4gICAgICBcImZvci1kaXJlY3Rpb25cIjogXCJlcnJvclwiLFxuICAgICAgXCJmdW5jLW5hbWUtbWF0Y2hpbmdcIjogXCJlcnJvclwiLFxuICAgICAgXCJmdW5jLW5hbWVzXCI6IFwiZXJyb3JcIiwgLy8gYWx3YXlzIHJlcXVpcmUgYSBuYW1lIGZvciBmdW5jdGlvbiBkZWNsYXJhdGlvblxuICAgICAgXCJmdW5jLXN0eWxlXCI6IFtcImVycm9yXCIsIFwiZGVjbGFyYXRpb25cIiwgeyBhbGxvd0Fycm93RnVuY3Rpb25zOiB0cnVlIH1dLFxuICAgICAgXCJnZXR0ZXItcmV0dXJuXCI6IFwiZXJyb3JcIixcbiAgICAgIFwiaW5pdC1kZWNsYXJhdGlvbnNcIjogXCJlcnJvclwiLFxuICAgICAgXCJsb2dpY2FsLWFzc2lnbm1lbnQtb3BlcmF0b3JzXCI6IFtcbiAgICAgICAgXCJlcnJvclwiLFxuICAgICAgICBcImFsd2F5c1wiLFxuICAgICAgICB7IGVuZm9yY2VGb3JJZlN0YXRlbWVudHM6IHRydWUgfSxcbiAgICAgIF0sXG4gICAgICBcIm1heC1kZXB0aFwiOiBbXCJlcnJvclwiLCB7IG1heDogNSB9XSxcbiAgICAgIFwibWF4LXBhcmFtc1wiOiBbXCJlcnJvclwiLCB7IG1heDogNCB9XSxcbiAgICAgIFwibm8tYml0d2lzZVwiOiBcImVycm9yXCIsXG4gICAgICBcIm5vLWNvbnNvbGVcIjogXCJlcnJvclwiLFxuICAgICAgXCJuby1jb25zdGFudC1iaW5hcnktZXhwcmVzc2lvblwiOiBcImVycm9yXCIsXG4gICAgICBcIm5vLWR1cGUtZWxzZS1pZlwiOiBcImVycm9yXCIsXG4gICAgICBcIm5vLWR1cGxpY2F0ZS1pbXBvcnRzXCI6IFwiZXJyb3JcIixcbiAgICAgIFwibm8tZW1wdHktc3RhdGljLWJsb2NrXCI6IFwiZXJyb3JcIixcbiAgICAgIFwibm8tZW1wdHktZnVuY3Rpb25cIjogXCJlcnJvclwiLFxuICAgICAgXCJuby1pbXBsaWNpdC1jb2VyY2lvblwiOiBbXG4gICAgICAgIFwiZXJyb3JcIixcbiAgICAgICAgeyBkaXNhbGxvd1RlbXBsYXRlU2hvcnRoYW5kOiB0cnVlLCBhbGxvdzogW1wiISFcIl0gfSxcbiAgICAgIF0sIC8vIGZvcmJpZCBjb2RlIGxpa2UgYGNvbnN0IG51bSA9ICtzdHJgO1xuICAgICAgXCJuby1pbm5lci1kZWNsYXJhdGlvbnNcIjogW1xuICAgICAgICBcImVycm9yXCIsXG4gICAgICAgIFwiZnVuY3Rpb25zXCIsXG4gICAgICAgIHsgYmxvY2tTY29wZWRGdW5jdGlvbnM6IFwiZGlzYWxsb3dcIiB9LFxuICAgICAgXSxcbiAgICAgIFwibm8taW52YWxpZC10aGlzXCI6IFwiZXJyb3JcIixcbiAgICAgIFwibm8tbG9uZWx5LWlmXCI6IFwiZXJyb3JcIixcbiAgICAgIFwibm8tbXVsdGktYXNzaWduXCI6IFwiZXJyb3JcIixcbiAgICAgIFwibm8tbmV3LW5hdGl2ZS1ub25jb25zdHJ1Y3RvclwiOiBcImVycm9yXCIsXG4gICAgICBcIm5vLW5vbm9jdGFsLWRlY2ltYWwtZXNjYXBlXCI6IFwiZXJyb3JcIixcbiAgICAgIFwibm8tb2JqZWN0LWNvbnN0cnVjdG9yXCI6IFwiZXJyb3JcIixcbiAgICAgIFwibm8tcGFyYW0tcmVhc3NpZ25cIjogXCJlcnJvclwiLFxuICAgICAgXCJuby1wbHVzcGx1c1wiOiBcImVycm9yXCIsXG4gICAgICBcIm5vLXNldHRlci1yZXR1cm5cIjogXCJlcnJvclwiLFxuICAgICAgXCJuby1zaGFkb3dcIjogW1wiZXJyb3JcIiwgeyBpZ25vcmVPbkluaXRpYWxpemF0aW9uOiB0cnVlIH1dLFxuICAgICAgXCJuby11bnNhZmUtb3B0aW9uYWwtY2hhaW5pbmdcIjogW1xuICAgICAgICBcImVycm9yXCIsXG4gICAgICAgIHsgZGlzYWxsb3dBcml0aG1ldGljT3BlcmF0b3JzOiB0cnVlIH0sXG4gICAgICBdLFxuICAgICAgXCJuby11bnVzZWQtbGFiZWxzXCI6IFwiZXJyb3JcIixcbiAgICAgIFwibm8tdW51c2VkLXByaXZhdGUtY2xhc3MtbWVtYmVyc1wiOiBcImVycm9yXCIsXG4gICAgICBcInJlcXVpcmUtYXdhaXRcIjogXCJlcnJv